parse_args()
引数の値が不明な場合にエラーがスローされる状況を手動で処理したいと思います。例:次のPythonファイルがある場合script.py
:
argp = argparse.ArgumentParser(description='example')
argp.add_argument('--compiler', choices=['default', 'clang3.4', 'clang3.5'])
args = argp.parse_args()
次の引数を使用しpython script.py --compiler=foo
てスクリプトを実行すると、次のエラーがスローされます。
error: argument --compiler: invalid choice: 'foo' (choose from 'default', 'clang3.4', 'clang3.5')
SystemExit: 2
スクリプトがそれ自体を終了するのではなく、この動作を自分で処理するために何をする必要がありますか?1つのアイデアは、メソッドをサブクラス化argparse.ArgumentParser
してオーバーライドするparse_args()
か、単にモンキーパッチを適用することですが、標準ライブラリの動作をオーバーライドする必要のない、より良い方法があるかどうか疑問に思いました。
選択肢を定義することの全体的なポイントは、リストにない値についてパーサーに文句を言わせることです。しかし、いくつかの選択肢があります。
選択肢を省略し(必要に応じてヘルプテキストに含めます)、解析後に独自のテストを行います。argparse
あなたのためにすべてをする必要はありません。主な目的は、ユーザーが何を望んでいるかを理解することです。
parser.error
メソッドを再定義して(サブクラス化が最適です)、からエラーをリダイレクトしますsys.exit
。ただし、このエラーとパーサーが発生する可能性のある他のエラーを区別するには、エラーメッセージを解析する必要があります。
type
選択肢をチェックし、デフォルトの置換を行う関数を定義します。
'--compiler'オプションの解析は次のようになります。
--compiler
フラグの後に文字列引数を取得しますtype
関数に渡します。デフォルトはlambda x:x
です。int
整数などに変換しValueError
ます。値上げは値が悪いです。choices
リスト(ある場合)と照合しますaction
して名前空間に値を追加します(デフォルトでは単に値を格納します)。これらのステップのいずれかでエラーが発生するArgumentError
と、parser.error
メソッドによってトラップされてメソッドに渡されるが生成されparser.exit
ます。
以来store_action
した後に発生type
し、choices
チェック、カスタムアクションしません自分のエラーバイパス。
考えられるtype
解決策は次のとおりです(テストされていません)
def compile_choices(astr):
if astr in ['default', 'clang3.4', 'clang3.5']:
return astr
else:
return 'default'
# could raise ValueError('bad value') if there are some strings you don't like
argp.add_argument('--compiler', type=compile_choices)
=================
compile_choices
選択肢のリストやデフォルトなど、他の引数を取る場合は、解析する前に、それらの値を定義する理由をいくつかラップする必要があります。
バイナリ文字列表現を受け入れる例:
parser.add_argument('--binary', type=lambda x: int(x, base=2),
help='integer in binary format', default='1010')
または
parser.add_argument('--binary', type=functools.partial(int, base=2), default='1010')
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加