2015-12-18 17 views
6

Sto scrivendo uno script python che prende due argomenti, e alcune opzioni di aiuto simile:Python argparse opzione

scriptname [-h] [-l] [-q|-d] arg1 arg2 

Il -q (silenzioso) e -d (debug) opzioni di cambiare il livello di dettaglio e la -h opzione è l'opzione di aiuto creata automaticamente da argparse.

Vorrei la possibilità -l (elenco) per comportarsi in modo simile all'opzione -h in quanto sarà non richiede che gli argomenti (altrimenti obbligatorie) sono presenti ed elencare alcune informazioni utili (diversa dall'opzione -h). In pratica, questo significa che lo script potrebbe essere chiamato nei seguenti tre modi:

scriptmane [-q|-d] arg1 arg2 
scriptname -l 
scriptname -h 

Due possibili modi di procedere sarebbe quello di: ('?' Con nargs =)

  1. Fare gli argomenti opzionali e aggiungere il codice per verificare che ci siano due argomenti in tutti i casi in cui non sono fornite le opzioni -l o -h.
  2. Scrive una classe azione personalizzata (non sono sicuro dei dettagli).

Ma spero che ci sia un modo più semplice per ereditare il comportamento "questa opzione è tutto ciò che serve" dall'opzione di aiuto.


Solution (in base alla risposta del samwyse):

Sulla base del _HelpAction() in argparse.py:

class _ListAction(argparse.Action): 
    def __init__(self, 
       option_strings, 
       dest=argparse.SUPPRESS, 
       default=argparse.SUPPRESS, 
       help=None): 
     super(_ListAction, self).__init__(
      option_strings=option_strings, 
      dest=dest, 
      default=default, 
      nargs=0, 
      help=help) 

    def __call__(self, parser, namespace, values, option_string=None): 
     print_list() 
     parser.exit() 

e poi, durante l'installazione parser:

parser.add_argument('-l', '--list', action=_ListAction, 
         help="List all available cases") 
+0

Esattamente quello che stavo pensando, ma essendo sul mio smartphone è stato difficile per me programmare. :) – samwyse

risposta

3

Se l'opzione "elenco" ha un comportamento diverso da "Guida", è necessario scrivere un'azione personalizzata. La buona notizia è che è molto semplice farlo. La pagina principale di argparse ti fornisce suggerimenti, devi solo rendertene conto che l'azione viene chiamata non appena l'opzione viene vista nell'elenco degli argomenti. Nella chiamata della nuova azione (che dovrebbe avere due trattini bassi a ciascuna estremità ma markdown usa quelli per l'enfasi), fai tutto ciò che devi fare per la tua opzione e poi chiama parser.exit() per cortocircuitare l'elaborazione di altri argomenti.

Vedere la sorgente per _HelpAction e _VersionAction qui: https://github.com/ThomasWaldmann/argparse/blob/master/argparse.py (e probabilmente solo una sottoclasse per ignorare la scrittura del codice di init).

1

Si può facilmente fai questo con argparse. Di seguito supporterà entrambi -l e --list opzioni di aiuto come ulteriori:

parser.add_argument("-l", "--list", action="help") 

Se non si desidera supportare la forma lunga (--list), è sufficiente ometterlo dalla lista degli argomenti.

+0

Ciò renderà semplicemente la parola "elenco" un sinonimo di "aiuto". Se vuole un'azione diversa, allora ha bisogno di scrivere un codice per questo. – samwyse

+0

Sì, ecco come ho interpretato la domanda. Ma forse non è corretto, ed è solo la parte che non richiede altri argomenti che dovrebbero essere come '-h'? –

+0

No, intendevo che le opzioni -h e -l fossero simili in quanto entrambe elencano informazioni utili e si chiudono e non richiedono gli altri argomenti, ma il testo che elencano sarà diverso. Modificherò e vedrò se diventa più chiaro. –