web-dev-qa-db-ja.com

Pythonで 'argparse.ArgumentError'を使用する

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

40
asmeurer

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

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_ を使用する必要があります。

パラメーターの依存関係

パラメーターの依存関係は、実際には引数parserによって行われるべきものではありません。セマンティックの詳細については、代わりに自分で行う必要があります。

_args = parser.parse_args()
if args.w and not args.p:
    parser.error('-p is required when -w is set.')
_

_ArgumentParser.error_ を使用すると、プログラムを中断してコンソールに出力するカスタムエラーメッセージを生成できます。

しかし、もちろん、このような基本的な状況では、可能であれば_-p_を暗黙的に推測するだけの方がはるかに理にかなっています。

58
poke

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'
14
ukrutt