Merge #13922: argparse no longer incorrectly strips '--' after the first one.
Patch by Jeff Knupp.
This commit is contained in:
commit
45ccf032be
|
@ -2189,9 +2189,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:
|
||||||
|
|
|
@ -1762,6 +1762,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
|
||||||
|
|
||||||
|
@ -1791,6 +1799,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(
|
||||||
|
@ -1825,15 +1837,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
|
||||||
|
@ -1844,15 +1856,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
|
||||||
|
@ -1863,15 +1875,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
|
||||||
|
@ -1880,18 +1892,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
|
||||||
|
@ -2002,6 +2015,7 @@ class TestAddSubparsers(TestCase):
|
||||||
1 (1alias1, 1alias2)
|
1 (1alias1, 1alias2)
|
||||||
1 help
|
1 help
|
||||||
2 2 help
|
2 2 help
|
||||||
|
3 3 help
|
||||||
"""))
|
"""))
|
||||||
|
|
||||||
# ============
|
# ============
|
||||||
|
|
|
@ -52,6 +52,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.
|
||||||
|
|
||||||
- Issues #10017 and #14998: Fix TypeError using pprint on dictionaries with
|
- Issues #10017 and #14998: Fix TypeError using pprint on dictionaries with
|
||||||
|
|
Loading…
Reference in New Issue