Przegląd wymagań
- użyj
argparse
(zignoruję ten)
- zezwalaj na wywołanie jednej lub dwóch akcji (przynajmniej jedna wymagana).
- spróbuj przez Pythonic (wolałbym to nazwać jak "POSIX")
Istnieją również pewne domniemane wymagania dotyczące życia w wierszu poleceń:
- wyjaśnić użytkownikowi użycie w łatwy do zrozumienia sposób
- opcje są opcjonalne
- pozwalają na określenie flag i opcji
- pozwalają na łączenie z innymi parametrami (jak nazwa pliku lub nazwy).
Przykładowe rozwiązanie przy użyciu docopt
(plik managelog.py
):
"""Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
Spróbuj go uruchomić:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Pokaż pomoc:
$ python managelog.py -h
Manage logfiles
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> P managelog.py [options] upload -- <logfile>...
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
I użyj go:
$ python managelog.py -V -U user -P secret upload -- alfa.log beta.log
{'--': True,
'--pswd': 'secret',
'--user': 'user',
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': False,
'upload': True}
Krótka alternatywa short.py
Może być jeszcze krótszy wariant:
"""Manage logfiles
Usage:
short.py [options] (process|upload)... -- <logfile>...
short.py -h
Options:
-V, --verbose Be verbose
-U, --user <user> Username
-P, --pswd <pswd> Password
Manage log file by processing and/or uploading it.
If upload requires authentication, you shall specify <user> and <password>
"""
if __name__ == "__main__":
from docopt import docopt
args = docopt(__doc__)
print args
Sposób użycia wygląda następująco:
$ python short.py -V process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 1,
'upload': 1}
Zauważ, że zamiast wartości logicznych dla kluczy „proces” i „przesyłanie” są liczniki.
Okazuje się, że nie możemy zapobiec powielaniu tych słów:
$ python short.py -V process process upload -- alfa.log beta.log
{'--': True,
'--pswd': None,
'--user': None,
'--verbose': True,
'-h': False,
'<logfile>': ['alfa.log', 'beta.log'],
'process': 2,
'upload': 1}
Wnioski
Zaprojektowanie dobrego interfejsu wiersza poleceń może czasami być trudne.
Program oparty na wierszu poleceń ma wiele aspektów:
- dobry projekt linii poleceń
- wybranie / użycie odpowiedniego parsera
argparse
oferuje dużo, ale ogranicza możliwe scenariusze i może stać się bardzo skomplikowany.
Dzięki temu docopt
rzeczy idą znacznie krócej, zachowując czytelność i oferując wysoki stopień elastyczności. Jeśli uda Ci się uzyskać przeanalizowane argumenty ze słownika i wykonać niektóre konwersje (na liczby całkowite, otwieranie plików ..) ręcznie (lub przez inną bibliotekę o nazwie schema
), może się okazać, że docopt
dobrze nadaje się do analizy z wiersza poleceń.
-x
jest powszechnie flagą i opcjonalną. Wytnij,-
jeśli jest to wymagane.