通常情况下,您可以连接类似' -abbb'等选项,这些选项会扩展为' -a -b -b -b'。对于a,计数为1,对于b,计数为3。
然而,在混合prefix_chars时,我看到了不同的东西......
import argparse
parser = argparse.ArgumentParser( prefix_chars='-+' )
parser.add_argument( '-x', action='count', dest='counter1' )
parser.add_argument( '+x', action='count', dest='counter2' )
args = parser.parse_args( '-xxx +xxx -xxx'.split() )
print( 'counter1 = ' + str(args.counter1) )
print( 'counter2 = ' + str(args.counter2) )
运行此结果:
counter1 = 8
counter2 = 1
显然' + xxx'不会扩展到' + x + x + x',而是扩展到' + x -x -x'。
将prefix_chars更改为' + - '结果:
counter1 = 2
counter2 = 7
现在' -xxx'扩展为' -x + x + x'。
这是定义的行为,还是我错过了什么?
答案 0 :(得分:1)
这是在2010年底,2.7早期修补的。
http://bugs.python.org/issue9352
=====
我不知道会影响这个的错误/问题或代码更改,但我可以深入研究它。
首先,在解析中会相当深入地处理单个前缀选项的字符串。在当前argparse.py
中,相关代码为:
class ArgumentParser
def _parse_known_args
# function to convert arg_strings into an optional action
def consume_optional(start_index):
match_argument = self._match_argument
action_tuples = []
while True:
...
chars = self.prefix_chars # e.g. the `-+` parameter
if arg_count == 0 and option_string[1] not in chars:
action_tuples.append((action, [], option_string))
char = option_string[0]
option_string = char + explicit_arg[0]
new_explicit_arg = explicit_arg[1:] or None
optionals_map = self._option_string_actions
if option_string in optionals_map:
action = optionals_map[option_string]
explicit_arg = new_explicit_arg
else:
msg = _('ignored explicit argument %r')
raise ArgumentError(action, msg % explicit_arg)
这是一对行:
char = option_string[0]
option_string = char + explicit_arg[0]
在处理重复字符时保留初始-/+
(在未解析的explicit_arg
字符串中。
我可以想象代码将+xyz
分成+x
,-y
,-z
,并更正为使用+x
,{{1 }},+y
。但它需要深入研究bug /问题和/或Python存储库,以确定是否以及何时进行了更改。
此问题+z
目前有什么问题?