https://github.com/python/cpython/commit/d2f3cfd38457204a2c47162de6f89ee3dd22fa99
commit: d2f3cfd38457204a2c47162de6f89ee3dd22fa99
branch: main
author: Jakob <[email protected]>
committer: savannahostrowski <[email protected]>
date: 2025-10-22T16:15:26Z
summary:
gh-140448: Default `suggest_on_error` to `True` in `argparse.ArgumentParser`
(#140450)
files:
A Misc/NEWS.d/next/Library/2025-10-22-12-56-57.gh-issue-140448.GsEkXD.rst
M Doc/library/argparse.rst
M Doc/whatsnew/3.15.rst
M Lib/argparse.py
M Lib/test/test_argparse.py
M Misc/ACKS
diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst
index a7603ac272633d..418f514995df3a 100644
--- a/Doc/library/argparse.rst
+++ b/Doc/library/argparse.rst
@@ -74,7 +74,7 @@ ArgumentParser objects
prefix_chars='-', fromfile_prefix_chars=None, \
argument_default=None, conflict_handler='error', \
add_help=True, allow_abbrev=True,
exit_on_error=True, \
- *, suggest_on_error=False, color=True)
+ *, suggest_on_error=True, color=True)
Create a new :class:`ArgumentParser` object. All parameters should be passed
as keyword arguments. Each parameter has its own more detailed description
@@ -117,7 +117,7 @@ ArgumentParser objects
error info when an error occurs. (default: ``True``)
* suggest_on_error_ - Enables suggestions for mistyped argument choices
- and subparser names (default: ``False``)
+ and subparser names (default: ``True``)
* color_ - Allow color output (default: ``True``)
@@ -134,6 +134,9 @@ ArgumentParser objects
.. versionchanged:: 3.14
*suggest_on_error* and *color* parameters were added.
+ .. versionchanged:: 3.15
+ *suggest_on_error* default changed to ``True``.
+
The following sections describe how each of these are used.
@@ -596,13 +599,11 @@ suggest_on_error
^^^^^^^^^^^^^^^^
By default, when a user passes an invalid argument choice or subparser name,
-:class:`ArgumentParser` will exit with error info and list the permissible
-argument choices (if specified) or subparser names as part of the error
message.
-
-If the user would like to enable suggestions for mistyped argument choices and
-subparser names, the feature can be enabled by setting ``suggest_on_error`` to
-``True``. Note that this only applies for arguments when the choices specified
-are strings::
+:class:`ArgumentParser` will exit with error info and provide suggestions for
+mistyped arguments. The error message will list the permissible argument
+choices (if specified) or subparser names, along with a "maybe you meant"
+suggestion if a close match is found. Note that this only applies for arguments
+when the choices specified are strings::
>>> parser = argparse.ArgumentParser(description='Process some integers.',
suggest_on_error=True)
@@ -612,16 +613,14 @@ are strings::
>>> parser.parse_args(['--action', 'sumn', 1, 2, 3])
tester.py: error: argument --action: invalid choice: 'sumn', maybe you
meant 'sum'? (choose from 'sum', 'max')
-If you're writing code that needs to be compatible with older Python versions
-and want to opportunistically use ``suggest_on_error`` when it's available, you
-can set it as an attribute after initializing the parser instead of using the
-keyword argument::
+You can disable suggestions by setting ``suggest_on_error`` to ``False``::
- >>> parser = argparse.ArgumentParser(description='Process some integers.')
- >>> parser.suggest_on_error = True
+ >>> parser = argparse.ArgumentParser(description='Process some integers.',
+ suggest_on_error=False)
.. versionadded:: 3.14
-
+.. versionchanged:: 3.15
+ Changed default value of ``suggest_on_error`` from ``False`` to ``True``.
color
^^^^^
diff --git a/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst
index 22e9cfde06f877..a9543bdd13e83f 100644
--- a/Doc/whatsnew/3.15.rst
+++ b/Doc/whatsnew/3.15.rst
@@ -317,6 +317,13 @@ New modules
Improved modules
================
+argparse
+--------
+
+* Changed the *suggest_on_error* parameter of :class:`argparse.ArgumentParser`
to
+ default to ``True``. This enables suggestions for mistyped arguments by
default.
+ (Contributed by Jakob Schluse in :gh:`140450`.)
+
calendar
--------
diff --git a/Lib/argparse.py b/Lib/argparse.py
index 1ddb7abbb35355..1f4413a9897eeb 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -1857,7 +1857,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
- exit_on_error -- Determines whether or not ArgumentParser exits with
error info when an error occurs
- suggest_on_error - Enables suggestions for mistyped argument choices
- and subparser names (default: ``False``)
+ and subparser names (default: ``True``)
- color - Allow color output in help messages (default: ``False``)
"""
@@ -1876,7 +1876,7 @@ def __init__(self,
allow_abbrev=True,
exit_on_error=True,
*,
- suggest_on_error=False,
+ suggest_on_error=True,
color=True,
):
superinit = super(ArgumentParser, self).__init__
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index e5d642cde662c2..d6c9c1ef2c81e8 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -2287,7 +2287,7 @@ class TestArgumentAndSubparserSuggestions(TestCase):
"""Test error handling and suggestion when a user makes a typo"""
def test_wrong_argument_error_with_suggestions(self):
- parser = ErrorRaisingArgumentParser(suggest_on_error=True)
+ parser = ErrorRaisingArgumentParser()
parser.add_argument('foo', choices=['bar', 'baz'])
with self.assertRaises(ArgumentParserError) as excinfo:
parser.parse_args(('bazz',))
@@ -2307,7 +2307,7 @@ def test_wrong_argument_error_no_suggestions(self):
)
def test_wrong_argument_subparsers_with_suggestions(self):
- parser = ErrorRaisingArgumentParser(suggest_on_error=True)
+ parser = ErrorRaisingArgumentParser()
subparsers = parser.add_subparsers(required=True)
subparsers.add_parser('foo')
subparsers.add_parser('bar')
@@ -2331,18 +2331,19 @@ def test_wrong_argument_subparsers_no_suggestions(self):
excinfo.exception.stderr,
)
- def test_wrong_argument_no_suggestion_implicit(self):
- parser = ErrorRaisingArgumentParser()
+ def test_wrong_argument_with_suggestion_explicit(self):
+ parser = ErrorRaisingArgumentParser(suggest_on_error=True)
parser.add_argument('foo', choices=['bar', 'baz'])
with self.assertRaises(ArgumentParserError) as excinfo:
parser.parse_args(('bazz',))
self.assertIn(
- "error: argument foo: invalid choice: 'bazz' (choose from bar,
baz)",
+ "error: argument foo: invalid choice: 'bazz', maybe you meant"
+ " 'baz'? (choose from bar, baz)",
excinfo.exception.stderr,
)
def test_suggestions_choices_empty(self):
- parser = ErrorRaisingArgumentParser(suggest_on_error=True)
+ parser = ErrorRaisingArgumentParser()
parser.add_argument('foo', choices=[])
with self.assertRaises(ArgumentParserError) as excinfo:
parser.parse_args(('bazz',))
@@ -2352,7 +2353,7 @@ def test_suggestions_choices_empty(self):
)
def test_suggestions_choices_int(self):
- parser = ErrorRaisingArgumentParser(suggest_on_error=True)
+ parser = ErrorRaisingArgumentParser()
parser.add_argument('foo', choices=[1, 2])
with self.assertRaises(ArgumentParserError) as excinfo:
parser.parse_args(('3',))
@@ -2362,7 +2363,7 @@ def test_suggestions_choices_int(self):
)
def test_suggestions_choices_mixed_types(self):
- parser = ErrorRaisingArgumentParser(suggest_on_error=True)
+ parser = ErrorRaisingArgumentParser()
parser.add_argument('foo', choices=[1, '2'])
with self.assertRaises(ArgumentParserError) as excinfo:
parser.parse_args(('3',))
diff --git a/Misc/ACKS b/Misc/ACKS
index 2dc513829a2218..6876380e0ba8d2 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1681,6 +1681,7 @@ David Scherer
Wolfgang Scherer
Felix Scherz
Hynek Schlawack
+Jakob Schluse
Bob Schmertz
Gregor Schmid
Ralf Schmitt
diff --git
a/Misc/NEWS.d/next/Library/2025-10-22-12-56-57.gh-issue-140448.GsEkXD.rst
b/Misc/NEWS.d/next/Library/2025-10-22-12-56-57.gh-issue-140448.GsEkXD.rst
new file mode 100644
index 00000000000000..db7f92e136d41b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-10-22-12-56-57.gh-issue-140448.GsEkXD.rst
@@ -0,0 +1,2 @@
+Change the default of ``suggest_on_error`` to ``True`` in
+``argparse.ArgumentParser``.
_______________________________________________
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]