Skip to content

Commit d2f3cfd

Browse files
authored
pythongh-140448: Default suggest_on_error to True in argparse.ArgumentParser (python#140450)
1 parent d51be28 commit d2f3cfd

File tree

6 files changed

+36
-26
lines changed

6 files changed

+36
-26
lines changed

Doc/library/argparse.rst

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ ArgumentParser objects
7474
prefix_chars='-', fromfile_prefix_chars=None, \
7575
argument_default=None, conflict_handler='error', \
7676
add_help=True, allow_abbrev=True, exit_on_error=True, \
77-
*, suggest_on_error=False, color=True)
77+
*, suggest_on_error=True, color=True)
7878
7979
Create a new :class:`ArgumentParser` object. All parameters should be passed
8080
as keyword arguments. Each parameter has its own more detailed description
@@ -117,7 +117,7 @@ ArgumentParser objects
117117
error info when an error occurs. (default: ``True``)
118118

119119
* suggest_on_error_ - Enables suggestions for mistyped argument choices
120-
and subparser names (default: ``False``)
120+
and subparser names (default: ``True``)
121121

122122
* color_ - Allow color output (default: ``True``)
123123

@@ -134,6 +134,9 @@ ArgumentParser objects
134134
.. versionchanged:: 3.14
135135
*suggest_on_error* and *color* parameters were added.
136136

137+
.. versionchanged:: 3.15
138+
*suggest_on_error* default changed to ``True``.
139+
137140
The following sections describe how each of these are used.
138141

139142

@@ -596,13 +599,11 @@ suggest_on_error
596599
^^^^^^^^^^^^^^^^
597600

598601
By default, when a user passes an invalid argument choice or subparser name,
599-
:class:`ArgumentParser` will exit with error info and list the permissible
600-
argument choices (if specified) or subparser names as part of the error message.
601-
602-
If the user would like to enable suggestions for mistyped argument choices and
603-
subparser names, the feature can be enabled by setting ``suggest_on_error`` to
604-
``True``. Note that this only applies for arguments when the choices specified
605-
are strings::
602+
:class:`ArgumentParser` will exit with error info and provide suggestions for
603+
mistyped arguments. The error message will list the permissible argument
604+
choices (if specified) or subparser names, along with a "maybe you meant"
605+
suggestion if a close match is found. Note that this only applies for arguments
606+
when the choices specified are strings::
606607

607608
>>> parser = argparse.ArgumentParser(description='Process some integers.',
608609
suggest_on_error=True)
@@ -612,16 +613,14 @@ are strings::
612613
>>> parser.parse_args(['--action', 'sumn', 1, 2, 3])
613614
tester.py: error: argument --action: invalid choice: 'sumn', maybe you meant 'sum'? (choose from 'sum', 'max')
614615

615-
If you're writing code that needs to be compatible with older Python versions
616-
and want to opportunistically use ``suggest_on_error`` when it's available, you
617-
can set it as an attribute after initializing the parser instead of using the
618-
keyword argument::
616+
You can disable suggestions by setting ``suggest_on_error`` to ``False``::
619617

620-
>>> parser = argparse.ArgumentParser(description='Process some integers.')
621-
>>> parser.suggest_on_error = True
618+
>>> parser = argparse.ArgumentParser(description='Process some integers.',
619+
suggest_on_error=False)
622620

623621
.. versionadded:: 3.14
624-
622+
.. versionchanged:: 3.15
623+
Changed default value of ``suggest_on_error`` from ``False`` to ``True``.
625624

626625
color
627626
^^^^^

Doc/whatsnew/3.15.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,13 @@ New modules
317317
Improved modules
318318
================
319319

320+
argparse
321+
--------
322+
323+
* Changed the *suggest_on_error* parameter of :class:`argparse.ArgumentParser` to
324+
default to ``True``. This enables suggestions for mistyped arguments by default.
325+
(Contributed by Jakob Schluse in :gh:`140450`.)
326+
320327
calendar
321328
--------
322329

Lib/argparse.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1857,7 +1857,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
18571857
- exit_on_error -- Determines whether or not ArgumentParser exits with
18581858
error info when an error occurs
18591859
- suggest_on_error - Enables suggestions for mistyped argument choices
1860-
and subparser names (default: ``False``)
1860+
and subparser names (default: ``True``)
18611861
- color - Allow color output in help messages (default: ``False``)
18621862
"""
18631863

@@ -1876,7 +1876,7 @@ def __init__(self,
18761876
allow_abbrev=True,
18771877
exit_on_error=True,
18781878
*,
1879-
suggest_on_error=False,
1879+
suggest_on_error=True,
18801880
color=True,
18811881
):
18821882
superinit = super(ArgumentParser, self).__init__

Lib/test/test_argparse.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2287,7 +2287,7 @@ class TestArgumentAndSubparserSuggestions(TestCase):
22872287
"""Test error handling and suggestion when a user makes a typo"""
22882288

22892289
def test_wrong_argument_error_with_suggestions(self):
2290-
parser = ErrorRaisingArgumentParser(suggest_on_error=True)
2290+
parser = ErrorRaisingArgumentParser()
22912291
parser.add_argument('foo', choices=['bar', 'baz'])
22922292
with self.assertRaises(ArgumentParserError) as excinfo:
22932293
parser.parse_args(('bazz',))
@@ -2307,7 +2307,7 @@ def test_wrong_argument_error_no_suggestions(self):
23072307
)
23082308

23092309
def test_wrong_argument_subparsers_with_suggestions(self):
2310-
parser = ErrorRaisingArgumentParser(suggest_on_error=True)
2310+
parser = ErrorRaisingArgumentParser()
23112311
subparsers = parser.add_subparsers(required=True)
23122312
subparsers.add_parser('foo')
23132313
subparsers.add_parser('bar')
@@ -2331,18 +2331,19 @@ def test_wrong_argument_subparsers_no_suggestions(self):
23312331
excinfo.exception.stderr,
23322332
)
23332333

2334-
def test_wrong_argument_no_suggestion_implicit(self):
2335-
parser = ErrorRaisingArgumentParser()
2334+
def test_wrong_argument_with_suggestion_explicit(self):
2335+
parser = ErrorRaisingArgumentParser(suggest_on_error=True)
23362336
parser.add_argument('foo', choices=['bar', 'baz'])
23372337
with self.assertRaises(ArgumentParserError) as excinfo:
23382338
parser.parse_args(('bazz',))
23392339
self.assertIn(
2340-
"error: argument foo: invalid choice: 'bazz' (choose from bar, baz)",
2340+
"error: argument foo: invalid choice: 'bazz', maybe you meant"
2341+
" 'baz'? (choose from bar, baz)",
23412342
excinfo.exception.stderr,
23422343
)
23432344

23442345
def test_suggestions_choices_empty(self):
2345-
parser = ErrorRaisingArgumentParser(suggest_on_error=True)
2346+
parser = ErrorRaisingArgumentParser()
23462347
parser.add_argument('foo', choices=[])
23472348
with self.assertRaises(ArgumentParserError) as excinfo:
23482349
parser.parse_args(('bazz',))
@@ -2352,7 +2353,7 @@ def test_suggestions_choices_empty(self):
23522353
)
23532354

23542355
def test_suggestions_choices_int(self):
2355-
parser = ErrorRaisingArgumentParser(suggest_on_error=True)
2356+
parser = ErrorRaisingArgumentParser()
23562357
parser.add_argument('foo', choices=[1, 2])
23572358
with self.assertRaises(ArgumentParserError) as excinfo:
23582359
parser.parse_args(('3',))
@@ -2362,7 +2363,7 @@ def test_suggestions_choices_int(self):
23622363
)
23632364

23642365
def test_suggestions_choices_mixed_types(self):
2365-
parser = ErrorRaisingArgumentParser(suggest_on_error=True)
2366+
parser = ErrorRaisingArgumentParser()
23662367
parser.add_argument('foo', choices=[1, '2'])
23672368
with self.assertRaises(ArgumentParserError) as excinfo:
23682369
parser.parse_args(('3',))

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1681,6 +1681,7 @@ David Scherer
16811681
Wolfgang Scherer
16821682
Felix Scherz
16831683
Hynek Schlawack
1684+
Jakob Schluse
16841685
Bob Schmertz
16851686
Gregor Schmid
16861687
Ralf Schmitt
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Change the default of ``suggest_on_error`` to ``True`` in
2+
``argparse.ArgumentParser``.

0 commit comments

Comments
 (0)