gh-61011: Fix inheritance of nested mutually exclusive groups in argparse (GH-125210)

Previously, all nested mutually exclusive groups lost their connection
to the group containing them and were displayed as belonging directly
to the parser.

Co-authored-by: Danica J. Sutherland <djsutherland@users.noreply.github.com>
This commit is contained in:
Serhiy Storchaka 2024-10-11 11:43:29 +03:00 committed by GitHub
parent 0135848059
commit 18c7449768
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 39 additions and 1 deletions

View File

@ -1521,7 +1521,11 @@ class _ActionsContainer(object):
# NOTE: if add_mutually_exclusive_group ever gains title= and
# description= then this code will need to be expanded as above
for group in container._mutually_exclusive_groups:
mutex_group = self.add_mutually_exclusive_group(
if group._container is container:
cont = self
else:
cont = title_group_map[group._container.title]
mutex_group = cont.add_mutually_exclusive_group(
required=group.required)
# map the actions to their new mutex group

View File

@ -2942,6 +2942,35 @@ class TestParentParsers(TestCase):
def test_wrong_type_parents(self):
self.assertRaises(TypeError, ErrorRaisingArgumentParser, parents=[1])
def test_mutex_groups_parents(self):
parent = ErrorRaisingArgumentParser(add_help=False)
g = parent.add_argument_group(title='g', description='gd')
g.add_argument('-w')
g.add_argument('-x')
m = g.add_mutually_exclusive_group()
m.add_argument('-y')
m.add_argument('-z')
parser = ErrorRaisingArgumentParser(prog='PROG', parents=[parent])
self.assertRaises(ArgumentParserError, parser.parse_args,
['-y', 'Y', '-z', 'Z'])
parser_help = parser.format_help()
self.assertEqual(parser_help, textwrap.dedent('''\
usage: PROG [-h] [-w W] [-x X] [-y Y | -z Z]
options:
-h, --help show this help message and exit
g:
gd
-w W
-x X
-y Y
-z Z
'''))
# ==============================
# Mutually exclusive group tests
# ==============================

View File

@ -1814,6 +1814,7 @@ Reuben Sumner
Eryk Sun
Sanjay Sundaresan
Marek Šuppa
Danica J. Sutherland
Hisao Suzuki
Kalle Svensson
Andrew Svetlov

View File

@ -0,0 +1,4 @@
Fix inheritance of nested mutually exclusive groups from parent parser in
:class:`argparse.ArgumentParser`. Previously, all nested mutually exclusive
groups lost their connection to the group containing them and were displayed
as belonging directly to the parser.