相关的Python错误是版本15112。
argparse: nargs='*'如果位置参数前面有一个选项和另一个位置,则不接受任何项目
argparse解析时,
['1', '2', '--spam', '8', '8','9']它首先尝试
['1','2']与尽可能多的位置参数匹配。使用您的参数,模式匹配字符串为
AAA*:
pos和分别为1个参数,为为
foo0个参数
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')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)