Перегляд вимог
- використання
argparse
(я проігнорую цей)
- дозволити викликати одну або дві дії (принаймні одна необхідна).
- спробуйте за допомогою Pythonic (я б скоріше назвав це "POSIX" -подібним)
Існує також кілька неявних вимог під час проживання в командному рядку:
- пояснити користувачеві використання так, щоб це було легко зрозуміти
- варіанти повинні бути необов’язковими
- дозволяють вказувати прапори та параметри
- дозволяють поєднувати з іншими параметрами (наприклад, ім'ям файлу або іменами).
Зразок рішення з використанням docopt
(файл 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
Спробуйте запустити його:
$ python managelog.py
Usage:
managelog.py [options] process -- <logfile>...
managelog.py [options] upload -- <logfile>...
managelog.py [options] process upload -- <logfile>...
managelog.py -h
Показати довідку:
$ 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>
І використовуйте його:
$ 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}
Коротка альтернатива short.py
Може бути ще коротший варіант:
"""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
Використання виглядає так:
$ 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}
Зауважте, що замість булевих значень для ключів "обробити" та "завантажити" є лічильники.
Виявляється, ми не можемо запобігти дублюванню цих слів:
$ 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}
Висновки
Розробка хорошого інтерфейсу командного рядка може бути складною часом.
Існує декілька аспектів програми на основі командного рядка:
- хороший дизайн командного рядка
- вибір / використання належного аналізатора
argparse
пропонує багато, але обмежує можливі сценарії і може стати дуже складним.
З часом docopt
справи йдуть набагато коротше, зберігаючи зручність читання та пропонуючи високий рівень гнучкості. Якщо вам вдається отримати розбір аргументів зі словника та виконати деякі перетворення (на ціле число, відкриття файлів ..) вручну (або іншою бібліотекою, що називається schema
), ви можете знайти docopt
підходящий для синтаксичного аналізу командного рядка.
-x
є універсальним прапором та необов’язковим. Виріжте,-
якщо це потрібно.