mirror of https://github.com/python/cpython
gh-53834: Fix support of arguments with choices in argparse (GH-124495)
Positional arguments with nargs equal to '?' or '*' no longer check default against choices. Optional arguments with nargs equal to '?' no longer check const against choices.
This commit is contained in:
parent
61180446ee
commit
dac4ec5286
|
@ -2487,7 +2487,6 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||
value = action.default
|
||||
if isinstance(value, str) and value is not SUPPRESS:
|
||||
value = self._get_value(action, value)
|
||||
self._check_value(action, value)
|
||||
|
||||
# when nargs='*' on a positional, if there were no command-line
|
||||
# args, use the default if it is anything other than None
|
||||
|
@ -2495,11 +2494,8 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
|
|||
not action.option_strings):
|
||||
if action.default is not None:
|
||||
value = action.default
|
||||
self._check_value(action, value)
|
||||
else:
|
||||
# since arg_strings is always [] at this point
|
||||
# there is no need to use self._check_value(action, value)
|
||||
value = arg_strings
|
||||
value = []
|
||||
|
||||
# single argument or optional argument produces a single value
|
||||
elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]:
|
||||
|
|
|
@ -628,9 +628,9 @@ class TestOptionalsNargsOptional(ParserTestCase):
|
|||
Sig('-w', nargs='?'),
|
||||
Sig('-x', nargs='?', const=42),
|
||||
Sig('-y', nargs='?', default='spam'),
|
||||
Sig('-z', nargs='?', type=int, const='42', default='84'),
|
||||
Sig('-z', nargs='?', type=int, const='42', default='84', choices=[1, 2]),
|
||||
]
|
||||
failures = ['2']
|
||||
failures = ['2', '-z a', '-z 42', '-z 84']
|
||||
successes = [
|
||||
('', NS(w=None, x=None, y='spam', z=84)),
|
||||
('-w', NS(w=None, x=None, y='spam', z=84)),
|
||||
|
@ -1027,8 +1027,8 @@ class TestPositionalsNargsZeroOrMore(ParserTestCase):
|
|||
class TestPositionalsNargsZeroOrMoreDefault(ParserTestCase):
|
||||
"""Test a Positional that specifies unlimited nargs and a default"""
|
||||
|
||||
argument_signatures = [Sig('foo', nargs='*', default='bar')]
|
||||
failures = ['-x']
|
||||
argument_signatures = [Sig('foo', nargs='*', default='bar', choices=['a', 'b'])]
|
||||
failures = ['-x', 'bar', 'a c']
|
||||
successes = [
|
||||
('', NS(foo='bar')),
|
||||
('a', NS(foo=['a'])),
|
||||
|
@ -1061,8 +1061,8 @@ class TestPositionalsNargsOptional(ParserTestCase):
|
|||
class TestPositionalsNargsOptionalDefault(ParserTestCase):
|
||||
"""Tests an Optional Positional with a default value"""
|
||||
|
||||
argument_signatures = [Sig('foo', nargs='?', default=42)]
|
||||
failures = ['-x', 'a b']
|
||||
argument_signatures = [Sig('foo', nargs='?', default=42, choices=['a', 'b'])]
|
||||
failures = ['-x', 'a b', '42']
|
||||
successes = [
|
||||
('', NS(foo=42)),
|
||||
('a', NS(foo='a')),
|
||||
|
@ -1075,9 +1075,9 @@ class TestPositionalsNargsOptionalConvertedDefault(ParserTestCase):
|
|||
"""
|
||||
|
||||
argument_signatures = [
|
||||
Sig('foo', nargs='?', type=int, default='42'),
|
||||
Sig('foo', nargs='?', type=int, default='42', choices=[1, 2]),
|
||||
]
|
||||
failures = ['-x', 'a b', '1 2']
|
||||
failures = ['-x', 'a b', '1 2', '42']
|
||||
successes = [
|
||||
('', NS(foo=42)),
|
||||
('1', NS(foo=1)),
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
Fix support of arguments with :ref:`choices` in :mod:`argparse`. Positional
|
||||
arguments with :ref:`nargs` equal to ``'?'`` or ``'*'`` no longer check
|
||||
:ref:`default` against ``choices``. Optional arguments with ``nargs`` equal
|
||||
to ``'?'`` no longer check :ref:`const` against ``choices``.
|
Loading…
Reference in New Issue