Python argparse选项串联

2024-10-03 02:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

运行此操作将导致:

^{pr2}$

显然“+xxx”并没有扩展到“+x+x+x”,而是扩展到了“+x-x-x”。在

将前缀“字符”更改为“+-”会导致:

counter1 = 2
counter2 = 7

现在'-xxx'扩展为'-x+x+x'。在

这是明确的行为,还是我遗漏了什么?在


Tags: addparsercountargparseargsactionargumentdest
1条回答
网友
1楼 · 发布于 2024-10-03 02:33:46

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

http://bugs.python.org/issue9352

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

我不知道会影响这一点的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)

这是一对线:

^{pr2}$

在处理重复字符时(在未解析的explicit_arg字符串中)保留初始-/+。在

我可以想象这样的情况:代码将+xyz拆分为+x-y-z,并被更正为使用+x+y+z。但这需要深入研究bug/问题和/或Python存储库,以确定是否以及何时进行了更改。在

你现在的问题是什么?在

相关问题 更多 >