diff options
author | Payton <72841140+paytonward6@users.noreply.github.com> | 2024-09-24 14:14:35 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 14:14:35 (GMT) |
commit | d21b0b5d36834d4d35aec3a01661597019594936 (patch) | |
tree | 93a77ac4e1b78c595e54c4f59dc283de20070d4c | |
parent | 4a5e4aade420c594c5b3fe0589e9e6b444bd6ee5 (diff) | |
download | cpython-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.py | 4 | ||||
-rw-r--r-- | Lib/test/test_argparse.py | 23 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2023-12-14-13-43-27.gh-issue-113008.jWYn8T.rst | 1 |
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 |