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

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

(cherry picked from commit 18c7449768)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Danica J. Sutherland <djsutherland@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2024-10-11 11:07:03 +02:00 committed by GitHub
parent 4c40381023
commit 23cefd9f4c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 39 additions and 1 deletions

View file

@ -1564,7 +1564,11 @@ class _ActionsContainer(object):
# NOTE: if add_mutually_exclusive_group ever gains title= and # NOTE: if add_mutually_exclusive_group ever gains title= and
# description= then this code will need to be expanded as above # description= then this code will need to be expanded as above
for group in container._mutually_exclusive_groups: 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) required=group.required)
# map the actions to their new mutex group # map the actions to their new mutex group

View file

@ -2880,6 +2880,35 @@ class TestParentParsers(TestCase):
-x X -x X
'''.format(progname, ' ' if progname else '' ))) '''.format(progname, ' ' if progname else '' )))
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 # Mutually exclusive group tests
# ============================== # ==============================

View file

@ -1792,6 +1792,7 @@ Reuben Sumner
Eryk Sun Eryk Sun
Sanjay Sundaresan Sanjay Sundaresan
Marek Šuppa Marek Šuppa
Danica J. Sutherland
Hisao Suzuki Hisao Suzuki
Kalle Svensson Kalle Svensson
Andrew Svetlov 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.