要件のレビュー
- 使用
argparse
(これは無視します)
- 1つまたは2つのアクションの呼び出しを許可します(少なくとも1つは必要です)。
- 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
普遍的にフラグであり、オプションです。-
必要に応じてカットします。