From a3b568711bb40e9ce524864d9a354e2b83faa17e Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 25 Nov 2025 11:27:28 +0100 Subject: [PATCH 1/4] Add colors to interpolated values in argparse --- Lib/_colorize.py | 2 +- Lib/argparse.py | 8 ++++++-- Lib/test/test_argparse.py | 16 ++++++++-------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Lib/_colorize.py b/Lib/_colorize.py index 29d7cc67b6e39d..0b7047620b4556 100644 --- a/Lib/_colorize.py +++ b/Lib/_colorize.py @@ -169,7 +169,7 @@ class Argparse(ThemeSection): label: str = ANSIColors.BOLD_YELLOW action: str = ANSIColors.BOLD_GREEN default: str = ANSIColors.GREY - default_value: str = ANSIColors.YELLOW + interpolated_value: str = ANSIColors.YELLOW reset: str = ANSIColors.RESET error: str = ANSIColors.BOLD_MAGENTA warning: str = ANSIColors.BOLD_YELLOW diff --git a/Lib/argparse.py b/Lib/argparse.py index 55ecdadd8c9398..5a3d426e03f05c 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -674,6 +674,10 @@ def _expand_help(self, action): params[name] = value.__name__ if params.get('choices') is not None: params['choices'] = ', '.join(map(str, params['choices'])) + # Before interpolating, wrap the values with color codes + t = self._theme + for name, value in params.items(): + params[name] = f"{t.interpolated_value}{value}{t.reset}" return help_string % params def _iter_indented_subactions(self, action): @@ -752,8 +756,8 @@ def _get_help_string(self, action): default_str = _(" (default: %(default)s)") prefix, suffix = default_str.split("%(default)s") help += ( - f" {t.default}{prefix.lstrip()}" - f"{t.default_value}%(default)s" + f" {t.default}{prefix.lstrip()}{t.reset}" + f"%(default)s" f"{t.default}{suffix}{t.reset}" ) return help diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index ef90d4bcbb2a36..3f2fd8be72bcba 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -7289,7 +7289,7 @@ def test_argparse_color(self): label_b = self.theme.label pos_b = self.theme.action default = self.theme.default - default_value = self.theme.default_value + interp = self.theme.interpolated_value reset = self.theme.reset # Act @@ -7316,17 +7316,17 @@ def test_argparse_color(self): {heading}options:{reset} {short_b}-h{reset}, {long_b}--help{reset} show this help message and exit - {short_b}-v{reset}, {long_b}--verbose{reset} more spam {default}(default: {default_value}False{default}){reset} - {short_b}-q{reset}, {long_b}--quiet{reset} less spam {default}(default: {default_value}False{default}){reset} + {short_b}-v{reset}, {long_b}--verbose{reset} more spam {default}(default: {reset}{interp}False{reset}{default}){reset} + {short_b}-q{reset}, {long_b}--quiet{reset} less spam {default}(default: {reset}{interp}False{reset}{default}){reset} {short_b}-o{reset}, {long_b}--optional1{reset} {long_b}--optional2{reset} {label_b}OPTIONAL2{reset} - pick one {default}(default: {default_value}None{default}){reset} + pick one {default}(default: {reset}{interp}None{reset}{default}){reset} {long_b}--optional3{reset} {label_b}{{X,Y,Z}}{reset} - {long_b}--optional4{reset} {label_b}{{X,Y,Z}}{reset} pick one {default}(default: {default_value}None{default}){reset} - {long_b}--optional5{reset} {label_b}{{X,Y,Z}}{reset} pick one {default}(default: {default_value}None{default}){reset} - {long_b}--optional6{reset} {label_b}{{X,Y,Z}}{reset} pick one {default}(default: {default_value}None{default}){reset} + {long_b}--optional4{reset} {label_b}{{X,Y,Z}}{reset} pick one {default}(default: {reset}{interp}None{reset}{default}){reset} + {long_b}--optional5{reset} {label_b}{{X,Y,Z}}{reset} pick one {default}(default: {reset}{interp}None{reset}{default}){reset} + {long_b}--optional6{reset} {label_b}{{X,Y,Z}}{reset} pick one {default}(default: {reset}{interp}None{reset}{default}){reset} {short_b}-p{reset}, {long_b}--optional7{reset} {label_b}{{Aaaaa,Bbbbb,Ccccc,Ddddd}}{reset} - pick one {default}(default: {default_value}None{default}){reset} + pick one {default}(default: {reset}{interp}None{reset}{default}){reset} {short_b}+f{reset} {label_b}F{reset} {long_b}++bar{reset} {label_b}BAR{reset} {long_b}-+baz{reset} {label_b}BAZ{reset} From 8c2b3db2689814b7dd75253d3eda306ec5311758 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 27 Nov 2025 19:53:28 +0100 Subject: [PATCH 2/4] Improve testing with more interpolated values --- Lib/test/test_argparse.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 3f2fd8be72bcba..987d0366e1a4f9 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -7263,6 +7263,13 @@ def test_argparse_color(self): choices=("Aaaaa", "Bbbbb", "Ccccc", "Ddddd"), help="pick one", ) + parser.add_argument( + "--optional8", + default="A", + metavar="X", + choices=("A", "B", "C"), + help="among %(choices)s, default is %(default)s", + ) parser.add_argument("+f") parser.add_argument("++bar") @@ -7302,8 +7309,8 @@ def test_argparse_color(self): f"""\ {heading}usage: {reset}{prog}PROG{reset} [{short}-h{reset}] [{short}-v{reset} | {short}-q{reset}] [{short}-o{reset}] [{long}--optional2 {label}OPTIONAL2{reset}] [{long}--optional3 {label}{{X,Y,Z}}{reset}] [{long}--optional4 {label}{{X,Y,Z}}{reset}] [{long}--optional5 {label}{{X,Y,Z}}{reset}] [{long}--optional6 {label}{{X,Y,Z}}{reset}] - [{short}-p {label}{{Aaaaa,Bbbbb,Ccccc,Ddddd}}{reset}] [{short}+f {label}F{reset}] [{long}++bar {label}BAR{reset}] [{long}-+baz {label}BAZ{reset}] - [{short}-c {label}COUNT{reset}] + [{short}-p {label}{{Aaaaa,Bbbbb,Ccccc,Ddddd}}{reset}] [{long}--optional8 {label}X{reset}] [{short}+f {label}F{reset}] [{long}++bar {label}BAR{reset}] + [{long}-+baz {label}BAZ{reset}] [{short}-c {label}COUNT{reset}] {pos}x{reset} {pos}y{reset} {pos}this_indeed_is_a_very_long_action_name{reset} {pos}{{sub1,sub2}} ...{reset} Colorful help @@ -7327,6 +7334,7 @@ def test_argparse_color(self): {long_b}--optional6{reset} {label_b}{{X,Y,Z}}{reset} pick one {default}(default: {reset}{interp}None{reset}{default}){reset} {short_b}-p{reset}, {long_b}--optional7{reset} {label_b}{{Aaaaa,Bbbbb,Ccccc,Ddddd}}{reset} pick one {default}(default: {reset}{interp}None{reset}{default}){reset} + {long_b}--optional8{reset} {label_b}X{reset} among {interp}A, B, C{reset}, default is {interp}A{reset} {short_b}+f{reset} {label_b}F{reset} {long_b}++bar{reset} {label_b}BAR{reset} {long_b}-+baz{reset} {label_b}BAZ{reset} From a7ca5c76beb40e21fc383b21f89de1d5738b1e06 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 08:25:27 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2025-11-28-08-25-19.gh-issue-141939.BXPnFj.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2025-11-28-08-25-19.gh-issue-141939.BXPnFj.rst diff --git a/Misc/NEWS.d/next/Library/2025-11-28-08-25-19.gh-issue-141939.BXPnFj.rst b/Misc/NEWS.d/next/Library/2025-11-28-08-25-19.gh-issue-141939.BXPnFj.rst new file mode 100644 index 00000000000000..c110f0661de601 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-28-08-25-19.gh-issue-141939.BXPnFj.rst @@ -0,0 +1 @@ +Add colour to all interpolated values in :mod:`argparse` help, like `%(default)s` or `%(choices)s`. Patch by Alex Prengère. From 802279f29a22e32e4d653af21d82b0179a657c38 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 28 Nov 2025 09:54:56 +0100 Subject: [PATCH 4/4] Fix blurb rst formatting --- .../next/Library/2025-11-28-08-25-19.gh-issue-141939.BXPnFj.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2025-11-28-08-25-19.gh-issue-141939.BXPnFj.rst b/Misc/NEWS.d/next/Library/2025-11-28-08-25-19.gh-issue-141939.BXPnFj.rst index c110f0661de601..2dfab54fcd01c2 100644 --- a/Misc/NEWS.d/next/Library/2025-11-28-08-25-19.gh-issue-141939.BXPnFj.rst +++ b/Misc/NEWS.d/next/Library/2025-11-28-08-25-19.gh-issue-141939.BXPnFj.rst @@ -1 +1 @@ -Add colour to all interpolated values in :mod:`argparse` help, like `%(default)s` or `%(choices)s`. Patch by Alex Prengère. +Add colour to all interpolated values in :mod:`argparse` help, like ``%(default)s`` or ``%(choices)s``. Patch by Alex Prengère.