summaryrefslogtreecommitdiffstats
path: root/Lib/argparse.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2024-06-28 15:04:44 (GMT)
committerGitHub <noreply@github.com>2024-06-28 15:04:44 (GMT)
commit99de20d729c14c9ea062c205b55925305ed797b6 (patch)
treecbb1a9161c46fac0746601f673a086ae0a5dfadb /Lib/argparse.py
parent394dc93bf99d01f085b6a76ba057b1941cc2ebc7 (diff)
downloadcpython-99de20d729c14c9ea062c205b55925305ed797b6.zip
cpython-99de20d729c14c9ea062c205b55925305ed797b6.tar.gz
cpython-99de20d729c14c9ea062c205b55925305ed797b6.tar.bz2
[3.13] gh-121018: Fix more cases of exiting in argparse when exit_on_error=False (GH-121056) (GH-121128)
* parse_intermixed_args() now raises ArgumentError instead of calling error() if exit_on_error is false. * Internal code now always raises ArgumentError instead of calling error(). It is then caught at the higher level and error() is called if exit_on_error is true. (cherry picked from commit 81a654a3425eaa05a51342509089533c1f623f1b)
Diffstat (limited to 'Lib/argparse.py')
-rw-r--r--Lib/argparse.py22
1 files changed, 13 insertions, 9 deletions
diff --git a/Lib/argparse.py b/Lib/argparse.py
index 64893b5..7e5e312 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -1819,7 +1819,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
# ==================================
def add_subparsers(self, **kwargs):
if self._subparsers is not None:
- self.error(_('cannot have multiple subparser arguments'))
+ raise ArgumentError(None, _('cannot have multiple subparser arguments'))
# add the parser class to the arguments if it's not present
kwargs.setdefault('parser_class', type(self))
@@ -1874,7 +1874,8 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
msg = _('unrecognized arguments: %s') % ' '.join(argv)
if self.exit_on_error:
self.error(msg)
- raise ArgumentError(None, msg)
+ else:
+ raise ArgumentError(None, msg)
return args
def parse_known_args(self, args=None, namespace=None):
@@ -2163,7 +2164,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
self._get_value(action, action.default))
if required_actions:
- self.error(_('the following arguments are required: %s') %
+ raise ArgumentError(None, _('the following arguments are required: %s') %
', '.join(required_actions))
# make sure all required groups had one option present
@@ -2179,7 +2180,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
for action in group._group_actions
if action.help is not SUPPRESS]
msg = _('one of the arguments %s is required')
- self.error(msg % ' '.join(names))
+ raise ArgumentError(None, msg % ' '.join(names))
# return the updated namespace and the extra arguments
return namespace, extras
@@ -2206,7 +2207,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
arg_strings = self._read_args_from_files(arg_strings)
new_arg_strings.extend(arg_strings)
except OSError as err:
- self.error(str(err))
+ raise ArgumentError(None, str(err))
# return the modified argument list
return new_arg_strings
@@ -2286,7 +2287,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
for action, option_string, sep, explicit_arg in option_tuples])
args = {'option': arg_string, 'matches': options}
msg = _('ambiguous option: %(option)s could match %(matches)s')
- self.error(msg % args)
+ raise ArgumentError(None, msg % args)
# if exactly one action matched, this segmentation is good,
# so return the parsed action
@@ -2346,7 +2347,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
# shouldn't ever get here
else:
- self.error(_('unexpected option string: %s') % option_string)
+ raise ArgumentError(None, _('unexpected option string: %s') % option_string)
# return the collected option tuples
return result
@@ -2403,8 +2404,11 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
def parse_intermixed_args(self, args=None, namespace=None):
args, argv = self.parse_known_intermixed_args(args, namespace)
if argv:
- msg = _('unrecognized arguments: %s')
- self.error(msg % ' '.join(argv))
+ msg = _('unrecognized arguments: %s') % ' '.join(argv)
+ if self.exit_on_error:
+ self.error(msg)
+ else:
+ raise ArgumentError(None, msg)
return args
def parse_known_intermixed_args(self, args=None, namespace=None):