nargs='?' 当两个 pos-arguments 被一个 opt-arguments 分割时不起作用,为什么?



我正在使用python 3.5.4(与3.7.0相同(,我有这样的问题。

argparser = argparse.ArgumentParser()
argparser.add_argument('pos1')
argparser.add_argument('-a')
argparser.add_argument('pos2', nargs='?', default=2) # I'd like it optional

它适用于前 3 种情况,但第 4 种失败了,为什么?

>>> argparser.parse_args(['-a', 'vala', '10', '20'])
Namespace(a='vala', pos1='10', pos2='20')
>>>
>>> argparser.parse_args(['-a', 'vala', '10'])
Namespace(a='vala', pos1='10', pos2=2)
>>>
>>> argparser.parse_args(['100', '-a', 'vala'])
Namespace(a='vala', pos1='100', pos2=2)
>>> 
>>> argparser.parse_args(['100', '-a', 'vala', '200'])
usage: [-h] [-a A] pos1 [pos2]
: error: unrecognized arguments: 200

对于第 4 种情况,我认为pos2应该收到200.我应该如何在不破坏前三者的情况下使其工作?

我认为nargs='?'使用一些与nargs=argparse.REMAINDER相同的机器来消耗其他未使用的令牌。 众所周知,nargs=argparse.REMAINDER阻止在常规选项标志(带连字符(之前使用其他位置参数:argparse。REMAINDER 更改位置参数的行为

似乎正在发生的事情是,只有当需要所有这些位置参数时,argparse才能在位置参数之后解析选项标志。 可以说是一个错误,但经典的Unix约定是要求所有选项标志(带连字符(出现在所有位置参数之前。

最新更新