GH-142267: Cache formatter to avoid repeated _set_color calls (#142268)

This commit is contained in:
Savannah Ostrowski 2025-12-05 08:47:50 -08:00 committed by GitHub
parent 4b14529730
commit 4085ff7b32
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 15 additions and 4 deletions

View file

@ -1568,8 +1568,8 @@ def add_argument(self, *args, **kwargs):
f'instance of it must be passed')
# raise an error if the metavar does not match the type
if hasattr(self, "_get_formatter"):
formatter = self._get_formatter()
if hasattr(self, "_get_validation_formatter"):
formatter = self._get_validation_formatter()
try:
formatter._format_args(action, None)
except TypeError:
@ -1763,8 +1763,8 @@ def _handle_conflict_resolve(self, action, conflicting_actions):
action.container._remove_action(action)
def _check_help(self, action):
if action.help and hasattr(self, "_get_formatter"):
formatter = self._get_formatter()
if action.help and hasattr(self, "_get_validation_formatter"):
formatter = self._get_validation_formatter()
try:
formatter._expand_help(action)
except (ValueError, TypeError, KeyError) as exc:
@ -1919,6 +1919,9 @@ def __init__(self,
self.suggest_on_error = suggest_on_error
self.color = color
# Cached formatter for validation (avoids repeated _set_color calls)
self._cached_formatter = None
add_group = self.add_argument_group
self._positionals = add_group(_('positional arguments'))
self._optionals = add_group(_('options'))
@ -2750,6 +2753,13 @@ def _get_formatter(self):
formatter._set_color(self.color)
return formatter
def _get_validation_formatter(self):
# Return cached formatter for read-only validation operations
# (_expand_help and _format_args). Avoids repeated slow _set_color calls.
if self._cached_formatter is None:
self._cached_formatter = self._get_formatter()
return self._cached_formatter
# =====================
# Help-printing methods
# =====================

View file

@ -0,0 +1 @@
Improve :mod:`argparse` performance by caching the formatter used for argument validation.