From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:14:56 +0000 (+0100) Subject: [3.14] GH-142267: Cache formatter to avoid repeated `_set_color` calls (GH-142268... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=37c6dd1c91159c87bb458c5c2e21f02a88f9386b;p=thirdparty%2FPython%2Fcpython.git [3.14] GH-142267: Cache formatter to avoid repeated `_set_color` calls (GH-142268) (#142313) GH-142267: Cache formatter to avoid repeated `_set_color` calls (GH-142268) (cherry picked from commit 4085ff7b32f91bad7d821e5564d8565c5928f7d1) Co-authored-by: Savannah Ostrowski --- diff --git a/Lib/argparse.py b/Lib/argparse.py index 88c1f5a7ef33..2a74bf27b9d6 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1552,8 +1552,8 @@ class _ActionsContainer(object): 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: @@ -1741,8 +1741,8 @@ class _ActionsContainer(object): 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: @@ -1897,6 +1897,9 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): 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')) @@ -2728,6 +2731,13 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): 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 # ===================== diff --git a/Misc/NEWS.d/next/Library/2025-12-04-23-26-12.gh-issue-142267.yOM6fP.rst b/Misc/NEWS.d/next/Library/2025-12-04-23-26-12.gh-issue-142267.yOM6fP.rst new file mode 100644 index 000000000000..f46e82105fc2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-04-23-26-12.gh-issue-142267.yOM6fP.rst @@ -0,0 +1 @@ +Improve :mod:`argparse` performance by caching the formatter used for argument validation.