summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2012-07-22 02:48:35 (GMT)
committerR David Murray <rdmurray@bitdance.com>2012-07-22 02:48:35 (GMT)
commit00528e8fec37bdf203bdb172ec3363353268d908 (patch)
treed2dc1bd67f033623d726f07d53018fa5a7d6b848
parentb94082a71b6b141cdcdde52a0f01b10f9334b5a8 (diff)
downloadcpython-00528e8fec37bdf203bdb172ec3363353268d908.zip
cpython-00528e8fec37bdf203bdb172ec3363353268d908.tar.gz
cpython-00528e8fec37bdf203bdb172ec3363353268d908.tar.bz2
#13922: argparse no longer incorrectly strips '--' after the first one.
Patch by Jeff Knupp.
-rw-r--r--Lib/argparse.py7
-rw-r--r--Lib/test/test_argparse.py38
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS3
4 files changed, 35 insertions, 14 deletions
diff --git a/Lib/argparse.py b/Lib/argparse.py
index 25803b3..0ee8c08 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -2186,9 +2186,12 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
# 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 --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index 1a72a13..3a29761 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -1761,6 +1761,14 @@ class TestAddSubparsers(TestCase):
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
@@ -1790,6 +1798,10 @@ class TestAddSubparsers(TestCase):
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(
@@ -1824,15 +1836,15 @@ class TestAddSubparsers(TestCase):
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
@@ -1843,15 +1855,15 @@ class TestAddSubparsers(TestCase):
# 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
@@ -1862,15 +1874,15 @@ class TestAddSubparsers(TestCase):
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
@@ -1879,18 +1891,19 @@ class TestAddSubparsers(TestCase):
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
@@ -2001,6 +2014,7 @@ class TestAddSubparsers(TestCase):
1 (1alias1, 1alias2)
1 help
2 2 help
+ 3 3 help
"""))
# ============
diff --git a/Misc/ACKS b/Misc/ACKS
index 95c06ba..51b5996 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -511,6 +511,7 @@ Thomas Kluyver
Kim Knapp
Lenny Kneler
Pat Knight
+Jeff Knupp
Greg Kochanski
Damon Kohler
Marko Kohtala
diff --git a/Misc/NEWS b/Misc/NEWS
index 57f3650..0b607db 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -98,6 +98,9 @@ Core and Builtins
Library
-------
+- Issue #13922: argparse no longer incorrectly strips '--'s that appear
+ after the first one.
+
- Issue #12353: argparse now correctly handles null argument values.
- Issues #10017 and #14998: Fix TypeError using pprint on dictionaries with