8000 gh-96310: Fix a traceback in argparse when all options in a mutually … · python/cpython@616c5fe · GitHub
[go: up one dir, main page]

Skip to content

Commit 616c5fe

Browse files
committed
gh-96310: Fix a traceback in argparse when all options in a mutually exclusive group are suppressed
Reproducer depends on terminal size - the traceback occurs when there's an option long enough so the usage line doesn't fit the terminal width. Option order is also important for reproducibility. Excluding empty groups (with all options suppressed) from inserts fixes the problem.
1 parent 0319cd6 commit 616c5fe

File tree

3 files changed

+23
-0
lines changed

3 files changed

+23
-0
lines changed

Lib/argparse.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,8 @@ def _format_actions_usage(self, actions, groups):
405405
else:
406406
end = start + len(group._group_actions)
407407
if actions[start:end] == group._group_actions:
408+
if all((action.help is SUPPRESS for action in group._group_actions)):
409+
continue
408410
for action in group._group_actions:
409411
group_actions.add(action)
410412
if not group.required:

Lib/test/test_argparse.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2695,6 +2695,25 @@ def test_help(self):
26952695
'''
26962696
self.assertEqual(parser.format_help(), textwrap.dedent(expected))
26972697

2698+
def test_help_subparser_all_mutually_exclusive_group_members_suppressed(self):
2699+
self.maxDiff = None
2700+
parser = ErrorRaisingArgumentParser(prog='PROG')
2701+
commands = parser.add_subparsers(title="commands", dest="command")
2702+
cmd_foo = commands.add_parser("foo")
2703+
group = cmd_foo.add_mutually_exclusive_group()
2704+
group.add_argument('--verbose', action='store_true', help=argparse.SUPPRESS)
2705+
group.add_argument('--quiet', action='store_true', help=argparse.SUPPRESS)
2706+
cmd_foo.add_argument("--longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong")
2707+
expected = '''\
2708+
usage: PROG foo [-h]
2709+
[--longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong LONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONG]
2710+
2711+
options:
2712+
-h, --help show this help message and exit
2713+
--longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong LONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONG
2714+
'''
2715+
self.assertEqual(cmd_foo.format_help(), textwrap.dedent(expected))
2716+
26982717
def test_empty_group(self):
26992718
# See issue 26952
27002719
parser = argparse.ArgumentParser()
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix a traceback in argparse when all options in a mutually exclusive group
2+
are suppressed.

0 commit comments

Comments
 (0)
0