我想在Python的ArgumentError
模块中使用argparse
异常,但我无法弄清楚如何使用它。签名说它应该被称为ArgumentError(argument, message)
,但我无法弄清argument
应该是什么。我认为它应该是解析器对象的一部分,但我找不到任何文档。
答案 0 :(得分:55)
ArgumentError:当解析器的操作出错时ArgumentParser对象引发的异常。解析命令行时引发的错误被ArgumentParser捕获并作为命令行消息发出。
构造函数的argument
参数是引发异常的Action
对象。通常不需要在Action
子类之外引出它,并且在对它进行子类化时,不需要明确地引出它;你通常会提出ValueError
(或任何合适的东西)。
关于您的评论,您只想接受介于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
会更有意义。
答案 1 :(得分:14)
尽管parser.error()
是大多数人可能想要的,但也可以使用argparse.ArgumentError()(如问题所示)。您需要引用参数,如bar_arg
in以下示例:
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'