gh-85427: Prevent exits if `ArgumentParser.exit_on_error` is False by jacobtylerwalls · Pull Request #30832 · python/cpython · GitHub
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 18 additions & 4 deletions Lib/argparse.py
25 changes: 24 additions & 1 deletion Lib/test/test_argparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -5594,7 +5594,8 @@ class TestExitOnError(TestCase):

def setUp(self):
self.parser = argparse.ArgumentParser(exit_on_error=False)
self.parser.add_argument('--integers', metavar='N', type=int)
self.parser.add_argument(
'--integers', metavar='N', type=int, required=True)

def test_exit_on_error_with_good_args(self):
ns = self.parser.parse_args('--integers 4'.split())
Expand All @@ -5604,6 +5605,28 @@ def test_exit_on_error_with_bad_args(self):
with self.assertRaises(argparse.ArgumentError):
self.parser.parse_args('--integers a'.split())

def test_exit_on_error_missing_required_arg(self):
msg = 'the following arguments are required: --integers'
with self.assertRaisesRegex(argparse.ArgumentError, msg):
self.parser.parse_args([])

def test_exit_on_error_unknown_arg(self):
msg = 'unrecognized arguments: --unknown'
with self.assertRaisesRegex(argparse.ArgumentError, msg):
self.parser.parse_args('--integers 4 --unknown'.split())
with self.assertRaisesRegex(argparse.ArgumentError, msg.replace('--', '')):
self.parser.parse_intermixed_args('--integers 4 unknown'.split())

def test_exit_on_error_mutually_exclusive_group(self):
other_parser = argparse.ArgumentParser(exit_on_error=False)
group = other_parser.add_mutually_exclusive_group(required=True)
group.add_argument('--up', action='store_true')
group.add_argument('--down', action='store_true')

msg = 'one of the arguments --up --down is required'
with self.assertRaisesRegex(argparse.ArgumentError, msg):
other_parser.parse_args([])


def tearDownModule():
# Remove global references to avoid looking like we have refleaks.
Expand Down