在Python中使用'argparse.ArgumentError'

时间:2011-11-12 21:34:32

标签: python argparse

我想在Python的ArgumentError模块中使用argparse异常,但我无法弄清楚如何使用它。签名说它应该被称为ArgumentError(argument, message),但我无法弄清argument应该是什么。我认为它应该是解析器对象的一部分,但我找不到任何文档。

2 个答案:

答案 0 :(得分:55)

来自the source documentation

  

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会更有意义。

答案 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'