Python argparse位置参数和子命令

Python argparse位置参数和子命令,第1张

Python argparse位置参数和子命令

起初,我认为与jcollado相同,但是事实是,如果后续(顶层)位置参数具有特定的

nargs
nargs
=
None
nargs
=整数),那么它将按您期望的那样工作。当
nargs
is
'?'
或or
'*'
时,它有时会失败
'+'
。因此,我深入研究了代码,以了解发生了什么。

归结为将参数拆分为消耗形式的方式。为了弄清楚谁得到了什么,在您的情况下,调用会

parse_args
字符串中汇总参数,例如
'AA'
,(
'A'
对于位置参数,
'O'
对于可选参数),并最终生成一个正则表达式模式以与该摘要字符串匹配,具体取决于您的 *** 作已通过
.add_argument
.add_subparsers
方法添加到解析器。

在每种情况下,例如,参数字符串最终都是

'AA'
。变化的是要匹配的模式(您可以在
_get_nargs_pattern
in中看到可能的模式
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']
,这不是您想要的。

简而言之:一团糟。我猜这应该被认为是一个错误,但不确定将模式转变为非贪婪模式会带来什么影响…



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5640143.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存