61

ArgumentErrorPythonのモジュールで例外を使いたいのargparseですが、使い方がわかりません。署名には、 として呼び出す必要があると書かれていますがArgumentError(argument, message)、何argumentをすべきかわかりません。これはパーサー オブジェクトの一部である必要があると思いますが、ドキュメントが見つかりませんでした。

4

2 に答える 2

87

ソースドキュメントから:

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)ます。カスタム エラー メッセージを指定する方法にすぎません。ValueErrorargparseArgumentTypeError

相互に排他的なパラメーター

相互に排他的なパラメーターの場合は、 を使用する必要があります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しかしもちろん、このような基本的な状況では、可能であれば暗黙のうちに推測する方がはるかに理にかなっています。

于 2011-11-12T21:45:15.287 に答える
26

おそらくほとんど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'
于 2015-02-09T23:54:18.513 に答える