起初我的想法与 jcollado 相同,但事实是,如果后续(顶级)位置参数具有特定的nargs
(nargs
= None
, nargs
= 整数),那么它就会按您的预期工作。当它失败时nargs
is '?'
or '*'
,有时当它是'+'
。因此,我深入研究代码,弄清楚发生了什么。
它归结为参数被分割以供使用的方式。要弄清楚谁得到了什么,请致电parse_args
将参数总结为一个字符串,例如'AA'
,在你的情况下('A'
对于位置参数,'O'
为可选),并最终生成一个与该摘要字符串匹配的正则表达式模式,具体取决于您通过以下方式添加到解析器的操作.add_argument
and .add_subparsers
方法。
在每种情况下,例如,参数字符串最终都是'AA'
。改变的是要匹配的模式(您可以在下面看到可能的模式)_get_nargs_pattern
in argparse.py
. For subpositional
它最终成为'(-*A[-AO]*)'
, 意思是允许一个参数后跟任意数量的选项或参数. For positional
,这取决于传递给的值nargs
:
-
None
=> '(-*A-*)'
- 3 =>
'(-*A-*A-*A-*)'
(one '-*A'
根据预期参数)
-
'?'
=> '(-*A?-*)'
-
'*'
=> '(-*[A-]*)'
-
'+'
=> '(-*A[A-]*)'
这些模式是附加的,对于nargs=None
(你的工作示例),你最终会得到'(-*A[-AO]*)(-*A-*)'
,匹配两个组['A', 'A']
。这边走,subpositional
只会解析subpositional
(你想要什么),同时positional
将匹配其动作。
For nargs='?'
,不过,你最终会得到'(-*A[-AO]*)(-*A?-*)'
。第二组完全由optional模式,以及*
贪婪,这意味着第一组通配字符串中的所有内容,最终识别出这两个组['AA', '']
。这意味着subpositional
当然,有两个争论,最终会窒息。
有趣的是,该模式nargs='+'
is '(-*A[-AO]*)(-*A[A-]*)'
,有效只要你只传递一个参数. Say subpositional a
,因为您需要在第二组中至少有一个位置参数。再次,由于第一组是贪婪的,所以传递subpositional a b c d
得到你['AAAA', 'A']
,这不是你想要的。
简而言之:一团糟。我想这应该被认为是一个错误,但不确定如果模式变成非贪婪模式会产生什么影响......