在Python中使用“argparse.ArgumentError”

2024-03-29 08:40:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在Python中的argparse模块中使用ArgumentError异常,但我不知道如何使用它。这个签名说它应该被称为ArgumentError(argument, message),但是我不知道argument应该是什么。我认为它应该是parser对象的一部分,但是我找不到它的任何文档。


Tags: 模块对象文档parsermessageargparseargumentargumenterror
2条回答

虽然parser.error()是大多数人可能想要的,但是也可以使用argparse.ArgumentError()(正如问题所问的那样)

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'

来自the source documentation

ArgumentError: The exception raised by ArgumentParser objects when there are errors with the parser's actions. Errors raised while parsing the command-line are caught by ArgumentParser and emitted as command-line messages.

构造函数的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模块的无效类型错误。^{}只是一种指定自定义错误消息的方法。

互斥参数

对于互斥参数,应该使用^{}

参数依赖性

参数依赖性并不是真正应该由参数解析器来完成的。对于语义细节,您应该自己做:

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

您可以使用^{}发出自定义错误消息,该消息将中断程序并打印到控制台。

当然,在这种基本情况下,如果可能的话,隐式猜测-p会更有意义。

相关问题 更多 >