栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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')


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/647993.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号