summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2024-06-26 10:16:19 (GMT)
committerGitHub <noreply@github.com>2024-06-26 10:16:19 (GMT)
commit6bc7e2cca546c11e2b807068a4a612d0d902da11 (patch)
tree374d556e5636337664110c374687daa47e28a676
parentf2b4f517b9a0dbe4d2ebd1e1912615ede46d7aec (diff)
downloadcpython-6bc7e2cca546c11e2b807068a4a612d0d902da11.zip
cpython-6bc7e2cca546c11e2b807068a4a612d0d902da11.tar.gz
cpython-6bc7e2cca546c11e2b807068a4a612d0d902da11.tar.bz2
[3.13] gh-121018: Ensure ArgumentParser.parse_args with exit_on_error=False raises instead of exiting when given unrecognized arguments (GH-121019) (GH-121032)
(cherry picked from commit 0654336dd5138aec04e3017e15ccbb90a44e053d) Co-authored-by: blhsing <blhsing@gmail.com>
-rw-r--r--Lib/argparse.py6
-rw-r--r--Lib/test/test_argparse.py3
-rw-r--r--Misc/NEWS.d/next/Library/2024-06-26-03-04-24.gh-issue-121018.clVSc4.rst2
3 files changed, 9 insertions, 2 deletions
diff --git a/Lib/argparse.py b/Lib/argparse.py
index 55bf8cd..64893b5 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -1871,8 +1871,10 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
def parse_args(self, args=None, namespace=None):
args, argv = self.parse_known_args(args, namespace)
if argv:
- msg = _('unrecognized arguments: %s')
- self.error(msg % ' '.join(argv))
+ msg = _('unrecognized arguments: %s') % ' '.join(argv)
+ if self.exit_on_error:
+ self.error(msg)
+ raise ArgumentError(None, msg)
return args
def parse_known_args(self, args=None, namespace=None):
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index 02b4991..3748529 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -6096,6 +6096,9 @@ class TestExitOnError(TestCase):
with self.assertRaises(argparse.ArgumentError):
self.parser.parse_args('--integers a'.split())
+ def test_exit_on_error_with_unrecognized_args(self):
+ with self.assertRaises(argparse.ArgumentError):
+ self.parser.parse_args('--foo bar'.split())
def tearDownModule():
# Remove global references to avoid looking like we have refleaks.
diff --git a/Misc/NEWS.d/next/Library/2024-06-26-03-04-24.gh-issue-121018.clVSc4.rst b/Misc/NEWS.d/next/Library/2024-06-26-03-04-24.gh-issue-121018.clVSc4.rst
new file mode 100644
index 0000000..fdc3c5f
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-06-26-03-04-24.gh-issue-121018.clVSc4.rst
@@ -0,0 +1,2 @@
+Fixed an issue where :meth:`!argparse.ArgumentParser.parses_args` did not honor ``exit_on_error=False`` when given unrecognized arguments.
+Patch by Ben Hsing.