diff --git a/Lib/typing.py b/Lib/typing.py index 1579f492003f74..fb4c7af4e06f95 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1099,7 +1099,12 @@ def _typevartuple_prepare_subst(self, alias, args): raise TypeError(f"Too few arguments for {alias};" f" actual {alen}, expected at least {plen-1}") if left == alen - right and self.has_default(): - replacement = _unpack_args(self.__default__) + try: + default = self.__default__ + except NameError: + default = annotationlib.call_evaluate_function( + self.evaluate_default, annotationlib.Format.FORWARDREF) + replacement = _unpack_args(default) else: replacement = args[left: alen - right] @@ -1125,7 +1130,12 @@ def _paramspec_prepare_subst(self, alias, args): params = alias.__parameters__ i = params.index(self) if i == len(args) and self.has_default(): - args = (*args, self.__default__) + try: + default = self.__default__ + except NameError: + default = annotationlib.call_evaluate_function( + self.evaluate_default, annotationlib.Format.FORWARDREF) + args = (*args, default) if i >= len(args): raise TypeError(f"Too few arguments for {alias}") # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612. @@ -1185,7 +1195,12 @@ def _generic_class_getitem(cls, args): for param in parameters: prepare = getattr(param, '__typing_prepare_subst__', None) if prepare is not None: - args = prepare(cls, args) + try: + args = prepare(cls, args) + except NameError: + default = annotationlib.call_evaluate_function( + param.evaluate_default, annotationlib.Format.FORWARDREF) + args = (*args, default) _check_generic_specialization(cls, args) new_args = [] diff --git a/Misc/NEWS.d/next/Library/2026-06-25-22-30-00.gh-issue-144361.lL9mN2.rst b/Misc/NEWS.d/next/Library/2026-06-25-22-30-00.gh-issue-144361.lL9mN2.rst new file mode 100644 index 00000000000000..a791b363ac32d4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-06-25-22-30-00.gh-issue-144361.lL9mN2.rst @@ -0,0 +1,4 @@ +Fix :exc:`NameError` when a type parameter default (PEP 696/PEP 749) +refers to a name defined later in the module. Now three call sites in +:mod:`typing` fall back to :func:`annotationlib.call_evaluate_function` +with :data:`~annotationlib.Format.FORWARDREF` when eager evaluation fails.