#13922: argparse no longer incorrectly strips '--' after the first one.

Patch by Jeff Knupp.
This commit is contained in:
R David Murray 2012-07-21 22:54:34 -04:00
parent 056c31f9cc
commit 68f555c03a
4 changed files with 34 additions and 14 deletions

View File

@ -2174,9 +2174,12 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
# Value conversion methods # Value conversion methods
# ======================== # ========================
def _get_values(self, action, arg_strings): 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]: 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 # optional argument produces a default when not present
if not arg_strings and action.nargs == OPTIONAL: if not arg_strings and action.nargs == OPTIONAL:

View File

@ -1764,6 +1764,14 @@ class TestAddSubparsers(TestCase):
parser2.add_argument('-y', choices='123', help='y help') parser2.add_argument('-y', choices='123', help='y help')
parser2.add_argument('z', type=complex, nargs='*', help='z 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 the main parser
return parser return parser
@ -1793,6 +1801,10 @@ class TestAddSubparsers(TestCase):
self.parser.parse_args('--foo 0.125 1 c'.split()), self.parser.parse_args('--foo 0.125 1 c'.split()),
NS(foo=True, bar=0.125, w=None, x='c'), 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): def test_parse_known_args(self):
self.assertEqual( self.assertEqual(
@ -1827,15 +1839,15 @@ class TestAddSubparsers(TestCase):
def test_help(self): def test_help(self):
self.assertEqual(self.parser.format_usage(), 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('''\ 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 main description
positional arguments: positional arguments:
bar bar help bar bar help
{1,2} command help {1,2,3} command help
optional arguments: optional arguments:
-h, --help show this help message and exit -h, --help show this help message and exit
@ -1846,15 +1858,15 @@ class TestAddSubparsers(TestCase):
# Make sure - is still used for help if it is a non-first prefix char # Make sure - is still used for help if it is a non-first prefix char
parser = self._get_parser(prefix_chars='+:-') parser = self._get_parser(prefix_chars='+:-')
self.assertEqual(parser.format_usage(), 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('''\ self.assertEqual(parser.format_help(), textwrap.dedent('''\
usage: PROG [-h] [++foo] bar {1,2} ... usage: PROG [-h] [++foo] bar {1,2,3} ...
main description main description
positional arguments: positional arguments:
bar bar help bar bar help
{1,2} command help {1,2,3} command help
optional arguments: optional arguments:
-h, --help show this help message and exit -h, --help show this help message and exit
@ -1865,15 +1877,15 @@ class TestAddSubparsers(TestCase):
def test_help_alternate_prefix_chars(self): def test_help_alternate_prefix_chars(self):
parser = self._get_parser(prefix_chars='+:/') parser = self._get_parser(prefix_chars='+:/')
self.assertEqual(parser.format_usage(), 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('''\ self.assertEqual(parser.format_help(), textwrap.dedent('''\
usage: PROG [+h] [++foo] bar {1,2} ... usage: PROG [+h] [++foo] bar {1,2,3} ...
main description main description
positional arguments: positional arguments:
bar bar help bar bar help
{1,2} command help {1,2,3} command help
optional arguments: optional arguments:
+h, ++help show this help message and exit +h, ++help show this help message and exit
@ -1882,18 +1894,19 @@ class TestAddSubparsers(TestCase):
def test_parser_command_help(self): def test_parser_command_help(self):
self.assertEqual(self.command_help_parser.format_usage(), 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(), self.assertEqual(self.command_help_parser.format_help(),
textwrap.dedent('''\ textwrap.dedent('''\
usage: PROG [-h] [--foo] bar {1,2} ... usage: PROG [-h] [--foo] bar {1,2,3} ...
main description main description
positional arguments: positional arguments:
bar bar help bar bar help
{1,2} command help {1,2,3} command help
1 1 help 1 1 help
2 2 help 2 2 help
3 3 help
optional arguments: optional arguments:
-h, --help show this help message and exit -h, --help show this help message and exit

View File

@ -462,6 +462,7 @@ Thomas Kluyver
Kim Knapp Kim Knapp
Lenny Kneler Lenny Kneler
Pat Knight Pat Knight
Jeff Knupp
Greg Kochanski Greg Kochanski
Damon Kohler Damon Kohler
Marko Kohtala Marko Kohtala

View File

@ -90,6 +90,9 @@ Core and Builtins
Library 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 #12353: argparse now correctly handles null argument values.
- Issue #6493: An issue in ctypes on Windows that caused structure bitfields - Issue #6493: An issue in ctypes on Windows that caused structure bitfields