ArgumentError
Pythonのモジュールで例外を使いたいのargparse
ですが、使い方がわかりません。署名には、 として呼び出す必要があると書かれていますがArgumentError(argument, message)
、何argument
をすべきかわかりません。これはパーサー オブジェクトの一部である必要があると思いますが、ドキュメントが見つかりませんでした。
2 に答える
ソースドキュメントから:
ArgumentError: パーサーのアクションでエラーが発生した場合に ArgumentParser オブジェクトによって発生する例外。コマンドラインの解析中に発生したエラーは、ArgumentParser によってキャッチされ、コマンドライン メッセージとして出力されます。
コンストラクターのargument
パラメーターはAction
、例外が発生するオブジェクトです。通常、サブクラスの外でこれを発生させる必要Action
はなく、サブクラス化する場合は明示的に発生させる必要はありません。通常ValueError
は代わりにレイズ (または適切なもの) をレイズします。
0 から 1 までの浮動小数点値
コメントに関しては、0 と 1 の間の浮動小数点値のみを受け入れたいということです。このためには、カスタム型を定義する機能を使用する必要があります。たとえば、次のようにできます。
def percentFloat (string):
value = float(string)
if value < 0 or value > 1:
raise argparse.ArgumentTypeError('Value has to be between 0 and 1')
return value
parser = argparse.ArgumentParser()
parser.add_argument('test', type=percentFloat)
parser.parse_args()
これは、非浮動小数点に対しても安全であることに注意してください。これは、モジュールによって無効な型エラーをトリガーする非浮動小数点に対しても発生しfloat(string)
ます。カスタム エラー メッセージを指定する方法にすぎません。ValueError
argparse
ArgumentTypeError
相互に排他的なパラメーター
相互に排他的なパラメーターの場合は、 を使用する必要がありますargparse.add_mutually_exclusive_group
。
パラメータ依存性
パラメーターの依存関係は、実際には引数パーサーによって実行されるべきものではありません。セマンティックの詳細については、代わりに自分で行う必要があります。
args = parser.parse_args()
if args.w and not args.p:
parser.error('-p is required when -w is set.')
ArgumentParser.error
プログラムを中断してコンソールに出力するカスタムエラーメッセージを表示するために使用できます。
-p
しかしもちろん、このような基本的な状況では、可能であれば暗黙のうちに推測する方がはるかに理にかなっています。
おそらくほとんどparser.error()
の人が望んでいるものですが、argparse.ArgumentError() を使用することもできます (質問にあるように)。bar_arg
以下の例のように、引数への参照が必要です。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
bar_arg = parser.add_argument('--bar')
args = parser.parse_args()
if args.bar == 'xyzzy':
raise argparse.ArgumentError(bar_arg, "Can't be 'xyzzy'")
if args.foo == 'xyzzy':
parser.error("Can't be 'xyzzy'")
これにより、以下のような出力が得られます。
$ python argparse_test.py --foo xyzzy
usage: argparse_test.py [-h] [--foo FOO] [--bar BAR]
argparse_test.py: error: Can't be 'xyzzy'
$ python argparse_test.py --bar xyzzy
Traceback (most recent call last):
File "argparse_test.py", line 10, in <module>
raise argparse.ArgumentError(bar_arg, "Can't be 'xyzzy'")
argparse.ArgumentError: argument --bar: Can't be 'xyzzy'