https://github.com/python/cpython/commit/0ed56ed88fc0ed3954cf601d116c7ba134910567
commit: 0ed56ed88fc0ed3954cf601d116c7ba134910567
branch: main
author: Savannah Ostrowski <[email protected]>
committer: savannahostrowski <[email protected]>
date: 2025-12-06T18:30:50Z
summary:
GH-64532: Include parent's required optional arguments in subparser usage
(#142355)
files:
A Misc/NEWS.d/next/Library/2025-12-06-16-45-34.gh-issue-64532.4OXZpF.rst
M Lib/argparse.py
M Lib/test/test_argparse.py
diff --git a/Lib/argparse.py b/Lib/argparse.py
index 27a63728eb4064..9e2e076936cb51 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -2004,14 +2004,16 @@ def add_subparsers(self, **kwargs):
self._subparsers = self._positionals
# prog defaults to the usage message of this parser, skipping
- # optional arguments and with no "usage:" prefix
+ # non-required optional arguments and with no "usage:" prefix
if kwargs.get('prog') is None:
# Create formatter without color to avoid storing ANSI codes in
prog
formatter = self.formatter_class(prog=self.prog)
formatter._set_color(False)
positionals = self._get_positional_actions()
+ required_optionals = [action for action in
self._get_optional_actions()
+ if action.required]
groups = self._mutually_exclusive_groups
- formatter.add_usage(None, positionals, groups, '')
+ formatter.add_usage(None, required_optionals + positionals,
groups, '')
kwargs['prog'] = formatter.format_help().strip()
# create the parsers action and add it to the positionals list
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index 041d3671706193..248a92db74eb69 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -2770,6 +2770,16 @@ def test_optional_subparsers(self):
ret = parser.parse_args(())
self.assertIsNone(ret.command)
+ def test_subparser_help_with_parent_required_optional(self):
+ parser = ErrorRaisingArgumentParser(prog='PROG')
+ parser.add_argument('--foo', required=True)
+ parser.add_argument('--bar')
+ subparsers = parser.add_subparsers()
+ parser_sub = subparsers.add_parser('sub')
+ parser_sub.add_argument('arg')
+ self.assertEqual(parser_sub.format_usage(),
+ 'usage: PROG --foo FOO sub [-h] arg\n')
+
def test_help(self):
self.assertEqual(self.parser.format_usage(),
'usage: PROG [-h] [--foo] bar {1,2,3} ...\n')
diff --git
a/Misc/NEWS.d/next/Library/2025-12-06-16-45-34.gh-issue-64532.4OXZpF.rst
b/Misc/NEWS.d/next/Library/2025-12-06-16-45-34.gh-issue-64532.4OXZpF.rst
new file mode 100644
index 00000000000000..3bd950050aedf4
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-12-06-16-45-34.gh-issue-64532.4OXZpF.rst
@@ -0,0 +1 @@
+Subparser help now includes required optional arguments from the parent parser
in the usage, making it clearer what arguments are needed to run a subcommand.
Patch by Savannah Ostrowski.
_______________________________________________
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]