From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Wed, 8 Oct 2025 04:23:47 +0000 (+0200) Subject: [3.14] gh-137706: make typing._is_unpacked_typevartuple check for `True` instead... X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=dd5d86c7d584eda78791c802a60a82fb27271d16;p=thirdparty%2FPython%2Fcpython.git [3.14] gh-137706: make typing._is_unpacked_typevartuple check for `True` instead of truthy (GH-137712) (#138574) gh-137706: make typing._is_unpacked_typevartuple check for `True` instead of truthy (GH-137712) (cherry picked from commit 7e652f402f84b412ec46cec42cb103f489a0087e) Co-authored-by: David Ellis --- diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index f19044bbcdee..b799be5ba7d8 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -9851,6 +9851,19 @@ class AnnotatedTests(BaseTestCase): self.assertIs(type(field_c2.__metadata__[0]), float) self.assertIs(type(field_c3.__metadata__[0]), bool) + def test_forwardref_partial_evaluation(self): + # Test that Annotated partially evaluates if it contains a ForwardRef + # See: https://github.com/python/cpython/issues/137706 + def f(x: Annotated[undefined, '']): pass + + ann = annotationlib.get_annotations(f, format=annotationlib.Format.FORWARDREF) + + # Test that the attributes are retrievable from the partially evaluated annotation + x_ann = ann['x'] + self.assertIs(get_origin(x_ann), Annotated) + self.assertEqual(x_ann.__origin__, EqualToForwardRef('undefined', owner=f)) + self.assertEqual(x_ann.__metadata__, ('',)) + class TypeAliasTests(BaseTestCase): def test_canonical_usage_with_variable_annotation(self): diff --git a/Lib/typing.py b/Lib/typing.py index dbc8734418d9..434cd0370e09 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1024,8 +1024,10 @@ def evaluate_forward_ref( def _is_unpacked_typevartuple(x: Any) -> bool: + # Need to check 'is True' here + # See: https://github.com/python/cpython/issues/137706 return ((not isinstance(x, type)) and - getattr(x, '__typing_is_unpacked_typevartuple__', False)) + getattr(x, '__typing_is_unpacked_typevartuple__', False) is True) def _is_typevar_like(x: Any) -> bool: diff --git a/Misc/NEWS.d/next/Library/2025-09-05-21-10-24.gh-issue-137706.0EztiJ.rst b/Misc/NEWS.d/next/Library/2025-09-05-21-10-24.gh-issue-137706.0EztiJ.rst new file mode 100644 index 000000000000..9eed50ec20a8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-09-05-21-10-24.gh-issue-137706.0EztiJ.rst @@ -0,0 +1 @@ +Fix the partial evaluation of annotations that use ``typing.Annotated[T, x]`` where ``T`` is a forward reference.