Python argparse选项连接

时间:2016-06-01 10:27:43

标签: python argparse

通常情况下,您可以连接类似' -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'。

这是定义的行为,还是我错过了什么?

1 个答案:

答案 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目前有什么问题?