Stai chiedendo per soluzione argparse, ma come si chiama anche per una soluzione Pythonic, io volutamente proporre un'alternativa utilizzando il pacchetto docopt
:
ottenerlo:
$ pip install docopt
scrivere il codice in mycommand
File:
"""
Usage:
mycommand compile [--disable] <zone>...
mycommand launch [--disable] <zone>...
Arguments:
<zone> zone name
Options:
-h --help
--disable disable
"""
from docopt import docopt
if __name__ == "__main__":
args = docopt(__doc__)
print args
Poi chiamare da linea di comando:
aiuto di base (senza argomenti):
$ python mycommand
Usage:
mycommand compile [--disable] <zone>...
mycommand launch [--disable] <zone>...
Chiedendo un aiuto:
$ python mycommand -h
Usage:
mycommand compile [--disable] <zone>...
mycommand launch [--disable] <zone>...
Arguments:
<zone> zone name
Options:
-h --help
--disable disable
Utilizzando compilare sottocomando:
$ python mycommand compile zoneAlfa zoneBeta
{'--disable': False,
'<zone>': ['zoneAlfa', 'zoneBeta'],
'compile': True,
'launch': False}
aggiungere bandiera --disable:
$ python mycommand compile --disable zoneAlfa zoneBeta
{'--disable': True,
'<zone>': ['zoneAlfa', 'zoneBeta'],
'compile': True,
'launch': False}
lancio sottocomando lavora troppo:
$ python mycommand launch --disable zoneAlfa zoneBeta
{'--disable': True,
'<zone>': ['zoneAlfa', 'zoneBeta'],
'compile': False,
'launch': True}
mio utilizzo dei parser argomento è iniziato con argparse troppo, e ho odiato la complessità del codice, che era necessario per fare qualcosa.
Più tardi ho trasformato in plac
, che è un modo molto efficiente per trasformare una funzione python in un comando molto utile per la console.
Tuttavia, ero limitato da un insieme di regole da seguire e capire, che non mi erano molto chiare in molti casi. Con docopt
apprezzo che posso scrivere prima la docstring, seguendo le regole standard di POSIX, e quindi usarla nel mio codice. Se ti interessa la convalida degli argomenti, ti indirizzerò ai campioni di questo fantastico pacchetto.
"Vorrei che le bandiere globali funzionassero * sia prima che dopo il sottocomando. *" Credo che questa soluzione non funzioni quando i flag sono forniti prima del sottocomando sulla riga di comando. Ho provato * anche * applicando il basic_subparser come genitore al parser di primo livello, ma questo si comporta male per required = True arguments. – Weeble