我如何最多接受两个参数,如果缺少一个则选择默认值

时间:2019-12-25 23:25:04

标签: python python-3.x argparse

我正在使用argparse解析我的Python程序的参数,我希望格式如下:

program --arg1 val1 val2

此参数不应再有其他值,而只能是一个。因此最多两个值。

我还想为第一个值val1提供一个默认值,以便在缺少该值时使用默认值。

例如,这些命令应该可以正常工作:

program --arg1 a b
# val1 = a
# val2 = b

program --arg1 a
# val1 = DEFAULT
# val2 = a

这些命令应该产生错误:

program --arg1
program --arg1 a b c

为此,库中提供了两个参数nargsdefault

nargs支持N+*?argparse.REMAINDER。但是这些都不对我有用,因为N恰好希望有N个参数,而如果我只给nargs=2一个参数,它将抛出一个错误。其余的都不满足要求。

default参数仅适用于nargs等于?*的位置参数。我该如何实现?

1 个答案:

答案 0 :(得分:1)

argparse并不支持所有可能的约定。最简单的方法是使用nargs='+',并对结果值进行后处理。

p = ArgumentParser()

p.add_argument("--arg1", nargs='+')

args = p.parse_args()

if args.arg1 is not None:
    if len(args.arg1) == 1:
        val1 = DEFAULT
        val2 = args.arg1[0]
    elif len(args.arg1) == 2:
        val1, val1 = args.arg1
    else:
        raise ArgumentTypeError("--arg1 requires 1 or 2 arguments")

请注意,仅在完全未指定default的情况下,才使用add_argument的{​​{1}}参数。在上面,我假设默认值为--arg1;如有必要,请调整None的支票。

我建议您自己解析一个参数,例如使用逗号或冒号分隔两个值。

args.arg1

,或者如果不使用def one_or_two(s): values = s.split(",") # or s.split(":"), etc if len(values) == 1: values.insert(0, "DEFAULT") return values[:2] p.add_argument("--arg1", type=one_or_two) args = p.parse_args() if args.arg1 is not None: val1, val2 = args.arg1 ,则完全使用第二个选项。

--arg1