nargs ='?'当两个pos参数被一个opt参数拆分时不起作用,为什么?

时间:2018-06-30 10:03:41

标签: python argparse

我正在使用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

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

1 个答案:

答案 0 :(得分:0)

我认为nargs='?'使用一些与nargs=argparse.REMAINDER相同的机制来消耗否则未使用的令牌。众所周知,nargs=argparse.REMAINDER会阻止在常规选项标志(带连字符)之前使用其他位置参数:argparse.REMAINDER changes the behavior of positional arguments

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