Python argparse选项连接

Python argparse选项连接,python,argparse,Python,Argparse,通常您可以连接选项,如'-abbb',它将扩展到'-a-b-b-b'。计数a为1,b为3 然而,当混合前缀字符时,我看到了一些不同的东西 import argparse parser = argparse.ArgumentParser( prefix_chars='-+' ) parser.add_argument( '-x', action='count', dest='counter1' ) parser.add_argument( '+x', action='count', dest='c

通常您可以连接选项,如'-abbb',它将扩展到'-a-b-b-b'。计数a为1,b为3

然而,当混合前缀字符时,我看到了一些不同的东西

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
counter1 = 2
counter2 = 7
显然,“+xxx”并没有扩展到“+x+x+x”,而是扩展到“+x-x-x”

将前缀_chars更改为“+-”将导致:

counter1 = 8
counter2 = 1
counter1 = 2
counter2 = 7
现在'-xxx'扩展为'-x+x+x'


这是已定义的行为,还是我遗漏了什么?

这是在2010年末2.7早期修补的

================

我不知道会影响这一点的bug/问题或代码更改,但我可以深入研究

首先,单前缀选项的字符串在解析中处理得相当深入。在当前的
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]
在处理重复字符(在未解析的
显式参数
字符串中)时,保留初始的
-/+

我可以想象这样一种情况,代码将
+xyz
分为
+x
-y
-z
,并被更正为使用
+x
+y
+z
。但这需要对bug/问题和/或Python存储库进行一些挖掘,以确定是否以及何时进行了更改


在这一点上,您的问题是什么?

我无法重现这种行为:对于Python3.5.1.6,我得到了6和3,对于Python2.7,我得到了3,对于Python3.5.1.6,对于Python2.7,我以交互方式在空闲状态下进行了尝试,也得到了6和3。Python2.7(r27:82500,2014年7月4日,14:51:17)出了问题这是什么版本?2.7.9?由于您的结果与Alan的结果相矛盾,您可能需要尝试将Python 2.7版本升级到2.7.11。