要件のレビュー
- 使用します
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