Skip to content

Commit 4868d1b

Browse files
[3.12] gh-121018: Ensure ArgumentParser.parse_args with exit_on_error=False raises instead of exiting when given unrecognized arguments (GH-121019) (GH-121031)
(cherry picked from commit 0654336) Co-authored-by: blhsing <[email protected]>
1 parent 6de373d commit 4868d1b

File tree

3 files changed

+9
-2
lines changed

3 files changed

+9
-2
lines changed

Lib/argparse.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -1895,8 +1895,10 @@ def _get_positional_actions(self):
18951895
def parse_args(self, args=None, namespace=None):
18961896
args, argv = self.parse_known_args(args, namespace)
18971897
if argv:
1898-
msg = _('unrecognized arguments: %s')
1899-
self.error(msg % ' '.join(argv))
1898+
msg = _('unrecognized arguments: %s') % ' '.join(argv)
1899+
if self.exit_on_error:
1900+
self.error(msg)
1901+
raise ArgumentError(None, msg)
19001902
return args
19011903

19021904
def parse_known_args(self, args=None, namespace=None):

Lib/test/test_argparse.py

+3
Original file line numberDiff line numberDiff line change
@@ -5743,6 +5743,9 @@ def test_exit_on_error_with_bad_args(self):
57435743
with self.assertRaises(argparse.ArgumentError):
57445744
self.parser.parse_args('--integers a'.split())
57455745

5746+
def test_exit_on_error_with_unrecognized_args(self):
5747+
with self.assertRaises(argparse.ArgumentError):
5748+
self.parser.parse_args('--foo bar'.split())
57465749

57475750
def tearDownModule():
57485751
# Remove global references to avoid looking like we have refleaks.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fixed an issue where :meth:`!argparse.ArgumentParser.parses_args` did not honor ``exit_on_error=False`` when given unrecognized arguments.
2+
Patch by Ben Hsing.

0 commit comments

Comments
 (0)