我想在 PythonArgumentError
的模块中使用异常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'