summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPayton <72841140+paytonward6@users.noreply.github.com>2024-09-24 14:14:35 (GMT)
committerGitHub <noreply@github.com>2024-09-24 14:14:35 (GMT)
commitd21b0b5d36834d4d35aec3a01661597019594936 (patch)
tree93a77ac4e1b78c595e54c4f59dc283de20070d4c
parent4a5e4aade420c594c5b3fe0589e9e6b444bd6ee5 (diff)
downloadcpython-d21b0b5d36834d4d35aec3a01661597019594936.zip
cpython-d21b0b5d36834d4d35aec3a01661597019594936.tar.gz
cpython-d21b0b5d36834d4d35aec3a01661597019594936.tar.bz2
gh-113008: Correct argparse usage output for required, mutually exclusive groups (GH-113085)
-rw-r--r--Lib/argparse.py4
-rw-r--r--Lib/test/test_argparse.py23
-rw-r--r--Misc/NEWS.d/next/Library/2023-12-14-13-43-27.gh-issue-113008.jWYn8T.rst1
3 files changed, 26 insertions, 2 deletions
diff --git a/Lib/argparse.py b/Lib/argparse.py
index 66192fb..694c46d 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -395,12 +395,12 @@ class HelpFormatter(object):
continue
try:
- start = actions.index(group._group_actions[0])
+ start = min(actions.index(item) for item in group._group_actions)
except ValueError:
continue
else:
end = start + len(group._group_actions)
- if actions[start:end] == group._group_actions:
+ if set(actions[start:end]) == set(group._group_actions):
group_actions.update(group._group_actions)
inserts[start, end] = group
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index c6b7698..ef05a6f 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -2902,6 +2902,29 @@ class TestMutuallyExclusiveGroupErrors(TestCase):
'''
self.assertEqual(parser.format_help(), textwrap.dedent(expected))
+ def test_optional_order(self):
+ parser = ErrorRaisingArgumentParser(prog='PROG')
+ group = parser.add_mutually_exclusive_group(required=True)
+ group.add_argument('--foo')
+ group.add_argument('bar', nargs='?')
+ expected = '''\
+ usage: PROG [-h] (--foo FOO | bar)
+
+ positional arguments:
+ bar
+
+ options:
+ -h, --help show this help message and exit
+ --foo FOO
+ '''
+ self.assertEqual(parser.format_help(), textwrap.dedent(expected))
+
+ parser = ErrorRaisingArgumentParser(prog='PROG')
+ group = parser.add_mutually_exclusive_group(required=True)
+ group.add_argument('bar', nargs='?')
+ group.add_argument('--foo')
+ self.assertEqual(parser.format_help(), textwrap.dedent(expected))
+
def test_help_subparser_all_mutually_exclusive_group_members_suppressed(self):
self.maxDiff = None
parser = ErrorRaisingArgumentParser(prog='PROG')
diff --git a/Misc/NEWS.d/next/Library/2023-12-14-13-43-27.gh-issue-113008.jWYn8T.rst b/Misc/NEWS.d/next/Library/2023-12-14-13-43-27.gh-issue-113008.jWYn8T.rst
new file mode 100644
index 0000000..0f2a442
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-12-14-13-43-27.gh-issue-113008.jWYn8T.rst
@@ -0,0 +1 @@
+Correct argparse usage output for required, mutually exclusive groups containing a positional argument