我正在使用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
。我如何在不破坏前三个的前提下使其工作?
答案 0 :(得分:0)
我认为nargs='?'
使用一些与nargs=argparse.REMAINDER
相同的机制来消耗否则未使用的令牌。众所周知,nargs=argparse.REMAINDER
会阻止在常规选项标志(带连字符)之前使用其他位置参数:argparse.REMAINDER changes the behavior of positional arguments
似乎正在发生的事情是,argparse
仅在所有这些位置参数都是必需的时才可以解析位置标志后的选项标志。可以说是一个错误,但是再一次,经典的Unix约定又是要求所有位置标记之前都带有所有选项标志(带连字符)。