https://github.com/python/cpython/commit/e73fbbacbba0dc65f8525eb710eaec618e18fa7d
commit: e73fbbacbba0dc65f8525eb710eaec618e18fa7d
branch: main
author: Hugo van Kemenade <[email protected]>
committer: savannahostrowski <[email protected]>
date: 2025-11-23T00:26:50Z
summary:

gh-141679: Add colour to defaults in `argparse` help (#141680)

Co-authored-by: Savannah Ostrowski <[email protected]>

files:
A Misc/NEWS.d/next/Library/2025-11-17-21-41-58.gh-issue-141679.fs7zLJ.rst
M Lib/_colorize.py
M Lib/argparse.py
M Lib/test/test_argparse.py

diff --git a/Lib/_colorize.py b/Lib/_colorize.py
index 7d573274328826..29d7cc67b6e39d 100644
--- a/Lib/_colorize.py
+++ b/Lib/_colorize.py
@@ -168,6 +168,8 @@ class Argparse(ThemeSection):
     short_option: str = ANSIColors.BOLD_GREEN
     label: str = ANSIColors.BOLD_YELLOW
     action: str = ANSIColors.BOLD_GREEN
+    default: str = ANSIColors.GREY
+    default_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 02a17d93bdfcf5..55ecdadd8c9398 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -748,7 +748,14 @@ def _get_help_string(self, action):
             if action.default is not SUPPRESS:
                 defaulting_nargs = [OPTIONAL, ZERO_OR_MORE]
                 if action.option_strings or action.nargs in defaulting_nargs:
-                    help += _(' (default: %(default)s)')
+                    t = self._theme
+                    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}{suffix}{t.reset}"
+                    )
         return help
 
 
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index 8af51b1fc6eb26..ef90d4bcbb2a36 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -7288,6 +7288,8 @@ def test_argparse_color(self):
         short_b = self.theme.short_option
         label_b = self.theme.label
         pos_b = self.theme.action
+        default = self.theme.default
+        default_value = self.theme.default_value
         reset = self.theme.reset
 
         # Act
@@ -7314,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: False)
-                  {short_b}-q{reset}, {long_b}--quiet{reset}           less 
spam (default: False)
+                  {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}-o{reset}, {long_b}--optional1{reset}
                   {long_b}--optional2{reset} {label_b}OPTIONAL2{reset}
-                                        pick one (default: None)
+                                        pick one {default}(default: 
{default_value}None{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: None)
-                  {long_b}--optional5{reset} {label_b}{{X,Y,Z}}{reset}   pick 
one (default: None)
-                  {long_b}--optional6{reset} {label_b}{{X,Y,Z}}{reset}   pick 
one (default: None)
+                  {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}
                   {short_b}-p{reset}, {long_b}--optional7{reset} 
{label_b}{{Aaaaa,Bbbbb,Ccccc,Ddddd}}{reset}
-                                        pick one (default: None)
+                                        pick one {default}(default: 
{default_value}None{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}
diff --git 
a/Misc/NEWS.d/next/Library/2025-11-17-21-41-58.gh-issue-141679.fs7zLJ.rst 
b/Misc/NEWS.d/next/Library/2025-11-17-21-41-58.gh-issue-141679.fs7zLJ.rst
new file mode 100644
index 00000000000000..b8203ca5a4a213
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-11-17-21-41-58.gh-issue-141679.fs7zLJ.rst
@@ -0,0 +1 @@
+Add colour to defaults in :mod:`argparse` help. Patch by Hugo van Kemenade.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to