https://github.com/python/cpython/commit/dac4ec52866e4068f3ac33b4da1e1a1fe6fc2cba
commit: dac4ec52866e4068f3ac33b4da1e1a1fe6fc2cba
branch: main
author: Serhiy Storchaka <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2024-09-29T10:52:52+03:00
summary:
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.
files:
A Misc/NEWS.d/next/Library/2024-09-25-10-25-57.gh-issue-53834.uyIckw.rst
M Lib/argparse.py
M Lib/test/test_argparse.py
diff --git a/Lib/argparse.py b/Lib/argparse.py
index 715d2ba39075e5..f428512d4007ef 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -2487,7 +2487,6 @@ def _get_values(self, action, arg_strings):
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 @@ def _get_values(self, action, arg_strings):
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]:
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index 01dc99c9434043..5c8f0ec0b58e9a 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -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)),
diff --git
a/Misc/NEWS.d/next/Library/2024-09-25-10-25-57.gh-issue-53834.uyIckw.rst
b/Misc/NEWS.d/next/Library/2024-09-25-10-25-57.gh-issue-53834.uyIckw.rst
new file mode 100644
index 00000000000000..20ba1534f5e99d
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-09-25-10-25-57.gh-issue-53834.uyIckw.rst
@@ -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``.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]