From: Serhiy Storchaka Date: Sat, 6 Dec 2025 18:03:45 +0000 (+0200) Subject: gh-142332: Fix usage formatting for positional arguments in mutually exclusive groups... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=70c27ce94b2c18f375c10e508e7d9323ae795496;p=thirdparty%2FPython%2Fcpython.git gh-142332: Fix usage formatting for positional arguments in mutually exclusive groups in argparse (GH-142333) --- diff --git a/Lib/argparse.py b/Lib/argparse.py index 07d7d77e8845..27a63728eb40 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -467,16 +467,12 @@ class HelpFormatter(object): # produce all arg strings elif not action.option_strings: default = self._get_default_metavar_for_positional(action) - part = ( - t.summary_action - + self._format_args(action, default) - + t.reset - ) - + part = self._format_args(action, default) # if it's in a group, strip the outer [] if action in group_actions: if part[0] == '[' and part[-1] == ']': part = part[1:-1] + part = t.summary_action + part + t.reset # produce the first way to invoke the option in brackets else: diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index dff7ba750fa5..041d36717061 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -7361,7 +7361,28 @@ class TestColorized(TestCase): ), ) - def test_argparse_color_usage(self): + def test_argparse_color_mutually_exclusive_group_usage(self): + parser = argparse.ArgumentParser(color=True, prog="PROG") + group = parser.add_mutually_exclusive_group() + group.add_argument('--foo', action='store_true', help='FOO') + group.add_argument('--spam', help='SPAM') + group.add_argument('badger', nargs='*', help='BADGER') + + prog = self.theme.prog + heading = self.theme.heading + long = self.theme.summary_long_option + short = self.theme.summary_short_option + label = self.theme.summary_label + pos = self.theme.summary_action + reset = self.theme.reset + + self.assertEqual(parser.format_usage(), + f"{heading}usage: {reset}{prog}PROG{reset} [{short}-h{reset}] " + f"[{long}--foo{reset} | " + f"{long}--spam {label}SPAM{reset} | " + f"{pos}badger ...{reset}]\n") + + def test_argparse_color_custom_usage(self): # Arrange parser = argparse.ArgumentParser( add_help=False, diff --git a/Misc/NEWS.d/next/Library/2025-12-06-13-02-13.gh-issue-142332.PNvXCV.rst b/Misc/NEWS.d/next/Library/2025-12-06-13-02-13.gh-issue-142332.PNvXCV.rst new file mode 100644 index 000000000000..ee2d5e1d4911 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-06-13-02-13.gh-issue-142332.PNvXCV.rst @@ -0,0 +1,2 @@ +Fix usage formatting for positional arguments in mutually exclusive groups in :mod:`argparse`. +in :mod:`argparse`.