From 24036f55e4787dae90fd49543fa67eab3ff57669 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 9 Dec 2025 19:36:24 +0200 Subject: [PATCH] [3.13] gh-112527: Fix help text for required options in argparse (GH-112528) (GH-142477) 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. (cherry picked from commit 1adb17b1a26e1547d14ca15f915e605cfdda3edd) Co-authored-by: Fabian Henze <32638720+henzef@users.noreply.github.com> --- Lib/argparse.py | 13 ++++++++----- Lib/test/test_argparse.py | 6 ++++-- .../2025-12-09-14-40-45.gh-issue-112527.Tvf5Zk.rst | 2 ++ 3 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-12-09-14-40-45.gh-issue-112527.Tvf5Zk.rst diff --git a/Lib/argparse.py b/Lib/argparse.py index adb35dd0180c..a0faa3f41e26 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -694,11 +694,14 @@ 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: - help += _(' (default: %(default)s)') + 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: + help += _(' (default: %(default)s)') return help diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 8974247e6e95..91475180a1d6 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -5134,6 +5134,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, @@ -5147,8 +5148,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 + '''\ @@ -5163,6 +5164,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 index 000000000000..70447bc64376 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-09-14-40-45.gh-issue-112527.Tvf5Zk.rst @@ -0,0 +1,2 @@ +The help text for required options in :mod:`argparse` no +longer extended with " (default: None)". -- 2.47.3