我正在使用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
nargs
支持N
,+
,*
,?
和argparse.REMAINDER
。但是这些都不对我有用,因为N
恰好希望有N个参数,而如果我只给nargs=2
一个参数,它将抛出一个错误。其余的都不满足要求。
default
参数仅适用于nargs
等于?
或*
的位置参数。我该如何实现?
答案 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