Argparse:如何处理可变数量的参数(nargs ='*')

Argparse:如何处理可变数量的参数(nargs ='*'),第1张

Argparse:如何处理可变数量的参数(nargs ='*')

相关的Python错误是版本15112。

argparse: nargs='*'
如果位置参数前面有一个选项和另一个位置,则不接受任何项目

argparse解析时,

['1', '2', '--spam', '8', '8','9']
它首先尝试
['1','2']
与尽可能多的位置参数匹配。使用您的参数,模式匹配字符串为
AAA*
pos
和分别为1个参数,为为
foo
0个参数
vars
(请记住,
*
表示ZERO_OR_MORE)。

['--spam','8']
由您的
--spam
论点处理。既然
vars
已经设置为
[]
,那么就没有什么可处理的了
['8','9']

编程更改为

argparse
检查
0
参数字符串是否满足模式,但仍有
optionals
待分析的情况。然后,它推迟了对该
*
参数的处理。

您可能可以通过以下方法解决此问题:首先使用解析输入

parse_known_args
,然后
remainder
使用另一个调用处理
parse_args

为了完全自由地在位置之间散布可选内容,在发行号14191中,我建议

parse_known_args
仅使用
optionals
,后跟一个
parse_args
仅了解位置的a。
parse_intermixed_args
我在那里发布的功能可以在
ArgumentParser
子类中实现,而无需修改
argparse.py
代码本身。


这是处理次级解析器的方法。我已经采用了该

parse_known_intermixed_args
函数,出于演示目的对其进行了简化,然后使其成为
parse_known_args
了Parser子类的功能。我不得不采取额外的步骤来避免递归。

最后,我更改了

_parser_class
子解析器Action的,因此每个子解析器都使用此替代方法
parse_known_args
。一种替代方法是子类化
_SubParsersAction
,可能会修改其子类
__call__

from argparse import ArgumentParserdef parse_known_intermixed_args(self, args=None, namespace=None):    # self - argparse parser    # simplified from http://bugs.python.org/file30204/test_intermixed.py    parsefn = super(SubParser, self).parse_known_args # avoid recursion    positionals = self._get_positional_actions()    for action in positionals:        # deactivate positionals        action.save_nargs = action.nargs        action.nargs = 0    namespace, remaining_args = parsefn(args, namespace)    for action in positionals:        # remove the empty positional values from namespace        if hasattr(namespace, action.dest): delattr(namespace, action.dest)    for action in positionals:        action.nargs = action.save_nargs    # parse positionals    namespace, extras = parsefn(remaining_args, namespace)    return namespace, extrasclass SubParser(ArgumentParser):    parse_known_args = parse_known_intermixed_argsparser = ArgumentParser()parser.add_argument('foo')sp = parser.add_subparsers(dest='cmd')sp._parser_class = SubParser # use different parser class for subparsersspp1 = sp.add_parser('cmd1')spp1.add_argument('-x')spp1.add_argument('bar')spp1.add_argument('vars',nargs='*')print parser.parse_args('foo cmd1 bar -x one 8 9'.split())# Namespace(bar='bar', cmd='cmd1', foo='foo', vars=['8', '9'], x='one')


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存