From 1ca45a5292a382d5902b80de5c8274994a985e84 Mon Sep 17 00:00:00 2001 From: Steven Bethard Date: Mon, 1 Nov 2010 15:57:36 +0000 Subject: [PATCH] Fix bug 9352 where characters were being lost in parsing some short options --- Lib/argparse.py | 14 +++++++------- Lib/test/test_argparse.py | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/Lib/argparse.py b/Lib/argparse.py index fa3b37764e..223790c49d 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1794,13 +1794,13 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): chars = self.prefix_chars if arg_count == 0 and option_string[1] not in chars: action_tuples.append((action, [], option_string)) - for char in self.prefix_chars: - option_string = char + explicit_arg[0] - explicit_arg = explicit_arg[1:] or None - optionals_map = self._option_string_actions - if option_string in optionals_map: - action = optionals_map[option_string] - break + 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) diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 358179b0b7..30302e9c4b 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -465,6 +465,30 @@ class TestOptionalsAlternatePrefixCharsAddedHelp(ParserTestCase): ('/ba +f', NS(f=True, bar=None, baz=42)) ] + +class TestOptionalsAlternatePrefixCharsMultipleShortArgs(ParserTestCase): + """Verify that Optionals must be called with their defined prefixes""" + + parser_signature = Sig(prefix_chars='+-', add_help=False) + argument_signatures = [ + Sig('-x', action='store_true'), + Sig('+y', action='store_true'), + Sig('+z', action='store_true'), + ] + failures = ['-w', + '-xyz', + '+x', + '-y', + '+xyz', + ] + successes = [ + ('', NS(x=False, y=False, z=False)), + ('-x', NS(x=True, y=False, z=False)), + ('+y -x', NS(x=True, y=True, z=False)), + ('+yz -x', NS(x=True, y=True, z=True)), + ] + + class TestOptionalsShortLong(ParserTestCase): """Test a combination of single- and double-dash option strings""" -- 2.40.0