]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-112527: Fix help text for required options in argparse (GH-112528)
authorFabian Henze <32638720+henzef@users.noreply.github.com>
Tue, 9 Dec 2025 16:48:35 +0000 (17:48 +0100)
committerGitHub <noreply@github.com>
Tue, 9 Dec 2025 16:48:35 +0000 (16:48 +0000)
For optional arguments with required=True, the ArgumentDefaultsHelpFormatter
would always add a " (default: None)" to the end of the help text.
Since that's a bit misleading, it is removed with this commit.

Lib/argparse.py
Lib/test/test_argparse.py
Misc/NEWS.d/next/Library/2025-12-09-14-40-45.gh-issue-112527.Tvf5Zk.rst [new file with mode: 0644]

index 1d550264ae420f47bc2af7f01a59b98dbfa4f04b..ed98aa9e974b2a8f3bc9f3cf5709f110a80777d7 100644 (file)
@@ -738,18 +738,21 @@ class ArgumentDefaultsHelpFormatter(HelpFormatter):
         if help is None:
             help = ''
 
-        if '%(default)' not in help:
-            if action.default is not SUPPRESS:
-                defaulting_nargs = [OPTIONAL, ZERO_OR_MORE]
-                if action.option_strings or action.nargs in defaulting_nargs:
-                    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}"
-                    )
+        if (
+            '%(default)' not in help
+            and action.default is not SUPPRESS
+            and not action.required
+        ):
+            defaulting_nargs = (OPTIONAL, ZERO_OR_MORE)
+            if action.option_strings or action.nargs in defaulting_nargs:
+                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
 
 
index ab5382e41e78719d372129d644a7a30ac4250f0b..24e8ab1c5cacbb65b8e0a08657232dd46d76fb54 100644 (file)
@@ -5419,6 +5419,7 @@ class TestHelpArgumentDefaults(HelpTestCase):
     argument_signatures = [
         Sig('--foo', help='foo help - oh and by the way, %(default)s'),
         Sig('--bar', action='store_true', help='bar help'),
+        Sig('--required', required=True, help='some help'),
         Sig('--taz', action=argparse.BooleanOptionalAction,
             help='Whether to taz it', default=True),
         Sig('--corge', action=argparse.BooleanOptionalAction,
@@ -5432,8 +5433,8 @@ class TestHelpArgumentDefaults(HelpTestCase):
          [Sig('--baz', type=int, default=42, help='baz help')]),
     ]
     usage = '''\
-        usage: PROG [-h] [--foo FOO] [--bar] [--taz | --no-taz] [--corge | --no-corge]
-                    [--quux QUUX] [--baz BAZ]
+        usage: PROG [-h] [--foo FOO] [--bar] --required REQUIRED [--taz | --no-taz]
+                    [--corge | --no-corge] [--quux QUUX] [--baz BAZ]
                     spam [badger]
         '''
     help = usage + '''\
@@ -5448,6 +5449,7 @@ class TestHelpArgumentDefaults(HelpTestCase):
           -h, --help           show this help message and exit
           --foo FOO            foo help - oh and by the way, None
           --bar                bar help (default: False)
+          --required REQUIRED  some help
           --taz, --no-taz      Whether to taz it (default: True)
           --corge, --no-corge  Whether to corge it
           --quux QUUX          Set the quux (default: 42)
diff --git a/Misc/NEWS.d/next/Library/2025-12-09-14-40-45.gh-issue-112527.Tvf5Zk.rst b/Misc/NEWS.d/next/Library/2025-12-09-14-40-45.gh-issue-112527.Tvf5Zk.rst
new file mode 100644 (file)
index 0000000..70447bc
--- /dev/null
@@ -0,0 +1,2 @@
+The help text for required options in :mod:`argparse` no
+longer extended with " (default: None)".