https://github.com/python/cpython/commit/23cefd9f4c9e49fbdef50b7deaf76499760e4c4b
commit: 23cefd9f4c9e49fbdef50b7deaf76499760e4c4b
branch: 3.12
author: Miss Islington (bot) <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2024-10-11T09:07:03Z
summary:

[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 18c74497681e0107d7cde53e63ea42feb38f2176)

Co-authored-by: Serhiy Storchaka <[email protected]>
Co-authored-by: Danica J. Sutherland <[email protected]>

files:
A Misc/NEWS.d/next/Library/2024-10-09-21-42-43.gh-issue-61011.pQXZb1.rst
M Lib/argparse.py
M Lib/test/test_argparse.py
M Misc/ACKS

diff --git a/Lib/argparse.py b/Lib/argparse.py
index bd5c757197fcf8..2a3253453dff84 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -1564,7 +1564,11 @@ def _add_container_actions(self, container):
         # 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
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index 13d15fbf075861..84f8b09fb1d2a4 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -2880,6 +2880,35 @@ def test_groups_parents(self):
               -x X
         '''.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
 # ==============================
diff --git a/Misc/ACKS b/Misc/ACKS
index b5dc32ee507689..837ffbda18aea1 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1792,6 +1792,7 @@ Reuben Sumner
 Eryk Sun
 Sanjay Sundaresan
 Marek Ć uppa
+Danica J. Sutherland
 Hisao Suzuki
 Kalle Svensson
 Andrew Svetlov
diff --git 
a/Misc/NEWS.d/next/Library/2024-10-09-21-42-43.gh-issue-61011.pQXZb1.rst 
b/Misc/NEWS.d/next/Library/2024-10-09-21-42-43.gh-issue-61011.pQXZb1.rst
new file mode 100644
index 00000000000000..20f9c0b9c78b12
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-10-09-21-42-43.gh-issue-61011.pQXZb1.rst
@@ -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.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to