2016-06-01 10 views
1

通常、 '-abbb'のようなオプションを連結できます。このオプションは '-a -b -b -b'に展開されます。カウントはaの場合は1、bの場合はabd 3となります。 prefix_charsを混合する際Python argparseオプションの連結

は、しかし私は、これは、その結果実行

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

私はこの振る舞いを再現することができません。Python 3.5.1では、一貫して6と3が得られます。 – Evert

+0

6と3もPython 2.7のため – AK47

+0

私はアイドル状態でインタラクティブに試してみましたが、6と3の結果も出ました。 –

答えて

1

これは初期の2.7

http://bugs.python.org/issue9352

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

に私はバグを認識していないよ、2010年後半にパッチが適用されました/ issueまたはこれに影響を与えるコードの変更が、私はそれを掘り下げることができます。

最初に、単一の接頭辞オプションの文字列は、解析にかなり深く処理されます。現在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) 

それはラインのペアです:解析対象外explicit_arg文字列に(繰り返される文字を取り扱う際

初期-/+を維持し

char = option_string[0] 
option_string = char + explicit_arg[0] 

+xに​​を、に、-zにコード分割して+xに修正した場合、 +y,+z。しかし、バグや問題やPythonリポジトリを掘り下げて、その変更がいつ、いつ行われたかを知る必要があります。

この時点であなたの問題argparse.pyには何がありますか?