changeset: 78233:bd2c167dfabc branch: 2.7 parent: 78231:c9806f0aaefb user: R David Murray date: Sat Jul 21 22:54:34 2012 -0400 files: Lib/argparse.py Lib/test/test_argparse.py Misc/ACKS Misc/NEWS description: #13922: argparse no longer incorrectly strips '--' after the first one. Patch by Jeff Knupp. diff -r c9806f0aaefb -r bd2c167dfabc Lib/argparse.py --- a/Lib/argparse.py Sat Jul 21 22:35:00 2012 -0400 +++ b/Lib/argparse.py Sat Jul 21 22:54:34 2012 -0400 @@ -2174,9 +2174,12 @@ # Value conversion methods # ======================== def _get_values(self, action, arg_strings): - # for everything but PARSER args, strip out '--' + # for everything but PARSER, REMAINDER args, strip out first '--' if action.nargs not in [PARSER, REMAINDER]: - arg_strings = [s for s in arg_strings if s != '--'] + try: + arg_strings.remove('--') + except ValueError: + pass # optional argument produces a default when not present if not arg_strings and action.nargs == OPTIONAL: diff -r c9806f0aaefb -r bd2c167dfabc Lib/test/test_argparse.py --- a/Lib/test/test_argparse.py Sat Jul 21 22:35:00 2012 -0400 +++ b/Lib/test/test_argparse.py Sat Jul 21 22:54:34 2012 -0400 @@ -1764,6 +1764,14 @@ parser2.add_argument('-y', choices='123', help='y help') parser2.add_argument('z', type=complex, nargs='*', help='z help') + # add third sub-parser + parser3_kwargs = dict(description='3 description') + if subparser_help: + parser3_kwargs['help'] = '3 help' + parser3 = subparsers.add_parser('3', **parser3_kwargs) + parser3.add_argument('t', type=int, help='t help') + parser3.add_argument('u', nargs='...', help='u help') + # return the main parser return parser @@ -1793,6 +1801,10 @@ self.parser.parse_args('--foo 0.125 1 c'.split()), NS(foo=True, bar=0.125, w=None, x='c'), ) + self.assertEqual( + self.parser.parse_args('-1.5 3 11 -- a --foo 7 -- b'.split()), + NS(foo=False, bar=-1.5, t=11, u=['a', '--foo', '7', '--', 'b']), + ) def test_parse_known_args(self): self.assertEqual( @@ -1827,15 +1839,15 @@ def test_help(self): self.assertEqual(self.parser.format_usage(), - 'usage: PROG [-h] [--foo] bar {1,2} ...\n') + 'usage: PROG [-h] [--foo] bar {1,2,3} ...\n') self.assertEqual(self.parser.format_help(), textwrap.dedent('''\ - usage: PROG [-h] [--foo] bar {1,2} ... + usage: PROG [-h] [--foo] bar {1,2,3} ... main description positional arguments: bar bar help - {1,2} command help + {1,2,3} command help optional arguments: -h, --help show this help message and exit @@ -1846,15 +1858,15 @@ # Make sure - is still used for help if it is a non-first prefix char parser = self._get_parser(prefix_chars='+:-') self.assertEqual(parser.format_usage(), - 'usage: PROG [-h] [++foo] bar {1,2} ...\n') + 'usage: PROG [-h] [++foo] bar {1,2,3} ...\n') self.assertEqual(parser.format_help(), textwrap.dedent('''\ - usage: PROG [-h] [++foo] bar {1,2} ... + usage: PROG [-h] [++foo] bar {1,2,3} ... main description positional arguments: bar bar help - {1,2} command help + {1,2,3} command help optional arguments: -h, --help show this help message and exit @@ -1865,15 +1877,15 @@ def test_help_alternate_prefix_chars(self): parser = self._get_parser(prefix_chars='+:/') self.assertEqual(parser.format_usage(), - 'usage: PROG [+h] [++foo] bar {1,2} ...\n') + 'usage: PROG [+h] [++foo] bar {1,2,3} ...\n') self.assertEqual(parser.format_help(), textwrap.dedent('''\ - usage: PROG [+h] [++foo] bar {1,2} ... + usage: PROG [+h] [++foo] bar {1,2,3} ... main description positional arguments: bar bar help - {1,2} command help + {1,2,3} command help optional arguments: +h, ++help show this help message and exit @@ -1882,18 +1894,19 @@ def test_parser_command_help(self): self.assertEqual(self.command_help_parser.format_usage(), - 'usage: PROG [-h] [--foo] bar {1,2} ...\n') + 'usage: PROG [-h] [--foo] bar {1,2,3} ...\n') self.assertEqual(self.command_help_parser.format_help(), textwrap.dedent('''\ - usage: PROG [-h] [--foo] bar {1,2} ... + usage: PROG [-h] [--foo] bar {1,2,3} ... main description positional arguments: bar bar help - {1,2} command help + {1,2,3} command help 1 1 help 2 2 help + 3 3 help optional arguments: -h, --help show this help message and exit diff -r c9806f0aaefb -r bd2c167dfabc Misc/ACKS --- a/Misc/ACKS Sat Jul 21 22:35:00 2012 -0400 +++ b/Misc/ACKS Sat Jul 21 22:54:34 2012 -0400 @@ -462,6 +462,7 @@ Kim Knapp Lenny Kneler Pat Knight +Jeff Knupp Greg Kochanski Damon Kohler Marko Kohtala diff -r c9806f0aaefb -r bd2c167dfabc Misc/NEWS --- a/Misc/NEWS Sat Jul 21 22:35:00 2012 -0400 +++ b/Misc/NEWS Sat Jul 21 22:54:34 2012 -0400 @@ -90,6 +90,9 @@ Library ------- +- Issue #13922: argparse no longer incorrectly strips '--'s that appear + after the first one. + - Issue #12353: argparse now correctly handles null argument values. - Issue #6493: An issue in ctypes on Windows that caused structure bitfields