Pytasz do sporządzania roztworu argparse, ale również zadzwonić na rozwiązanie pythonic będę celowo zaproponować alternatywę za pomocą pakietu docopt
:
dostać go:
$ pip install docopt
Wpisz swój kod do mycommand
plik:
"""
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
następnie wywołać ją z linii poleceń:
podstawowa pomoc (bez argumentów):
$ python mycommand
Usage:
mycommand compile [--disable] <zone>...
mycommand launch [--disable] <zone>...
Prośba o pomoc:
$ python mycommand -h
Usage:
mycommand compile [--disable] <zone>...
mycommand launch [--disable] <zone>...
Arguments:
<zone> zone name
Options:
-h --help
--disable disable
Korzystanie kompilacji komendy:
$ python mycommand compile zoneAlfa zoneBeta
{'--disable': False,
'<zone>': ['zoneAlfa', 'zoneBeta'],
'compile': True,
'launch': False}
dodać flagę --disable:
$ python mycommand compile --disable zoneAlfa zoneBeta
{'--disable': True,
'<zone>': ['zoneAlfa', 'zoneBeta'],
'compile': True,
'launch': False}
launch Komenda działa zbyt:
$ python mycommand launch --disable zoneAlfa zoneBeta
{'--disable': True,
'<zone>': ['zoneAlfa', 'zoneBeta'],
'compile': False,
'launch': True}
Moja wykorzystanie parserami argumentów zaczęło się argparse też, i nienawidziłem złożoność kodu, który był potrzebny do zrobienia czegoś.
Później zmieniłem się w plac
, co jest bardzo skutecznym sposobem przekształcenia funkcji Pythona w bardzo użyteczne polecenie dla konsoli.
Nadal byłem ograniczony zestawem zasad do naśladowania i zrozumienia, które nie były dla mnie zbyt jasne w wielu przypadkach. Dzięki docopt
doceniam, że najpierw mogę napisać docstring, stosując standardowe reguły POSIX, a następnie użyć go w moim kodzie. Jeśli zależy ci na sprawdzeniu argumentów, skieruję cię do próbek tego wspaniałego pakietu.
"Chciałbym, aby flagi globalne działały * niezależnie od tego, czy są przed, czy po podkomende. *" Wierzę, że to rozwiązanie nie działa, gdy flagi są dostarczane przed podkomenda w wierszu polecenia. Próbowałem * również * stosowania base_subparser jako nadrzędny do parser najwyższego poziomu, ale to zachowuje się źle dla wymaganych = True argumentów. – Weeble