起初,我认为与jcollado相同,但是事实是,如果后续(顶层)位置参数具有特定的
nargs(
nargs=
None,
nargs=整数),那么它将按您期望的那样工作。当
nargsis
'?'或or
'*'时,它有时会失败
'+'。因此,我深入研究了代码,以了解发生了什么。
归结为将参数拆分为消耗形式的方式。为了弄清楚谁得到了什么,在您的情况下,调用会
parse_args在字符串中汇总参数,例如
'AA',(
'A'对于位置参数,
'O'对于可选参数),并最终生成一个正则表达式模式以与该摘要字符串匹配,具体取决于您的 *** 作已通过
.add_argument和
.add_subparsers方法添加到解析器。
在每种情况下,例如,参数字符串最终都是
'AA'。变化的是要匹配的模式(您可以在
_get_nargs_patternin中看到可能的模式
argparse.py。因为
subpositional最终会存在
'(-*A[-AO]*)',这意味着
允许一个参数后跟任意数量的选项或参数 。对于
positional,它取决于传递给
nargs:
None
=>'(-*A-*)'
- 3 =>
'(-*A-*A-*A-*)'
('-*A'
每个预期参数一个) '?'
=>'(-*A?-*)'
'*'
=>'(-*[A-]*)'
'+'
=>'(-*A[A-]*)'
这些模式被附加,对于
nargs=None(您的工作示例),您最终得到
'(-*A[-AO]*)(-*A-*)',它与两组匹配
['A','A']。这样,
subpositional将仅解析
subpositional(您想要的内容),同时
positional匹配其动作。
因为
nargs='?',最终您得到
'(-*A[-AO]*)(-*A?-*)'。第二组完全由 可选
模式组成,并且
*是贪婪的,这意味着第一组将字符串中的所有内容都模糊不清,最终识别出这两个组
['AA','']。当然,这意味着
subpositional有两个参数,最终会令人窒息。
有趣的
nargs='+'是
'(-*A[-AO]*)(-*A[A-]*)',for的模式 只要您仅传递一个参数就可以使用
。说
subpositional a,因为您在第二组中至少需要一个位置参数。同样,由于第一组是贪婪的,所以传递
subpositional a b cd会获得
['AAAA', 'A'],这不是您想要的。
简而言之:一团糟。我猜这应该被认为是一个错误,但不确定将模式转变为非贪婪模式会带来什么影响…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)