https://github.com/python/cpython/commit/dd5d86c7d584eda78791c802a60a82fb27271d16
commit: dd5d86c7d584eda78791c802a60a82fb27271d16
branch: 3.14
author: Miss Islington (bot) <[email protected]>
committer: JelleZijlstra <[email protected]>
date: 2025-10-07T21:23:47-07:00
summary:

[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 <[email protected]>

files:
A Misc/NEWS.d/next/Library/2025-09-05-21-10-24.gh-issue-137706.0EztiJ.rst
M Lib/test/test_typing.py
M Lib/typing.py

diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index f19044bbcdeeae..b799be5ba7d8fd 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -9851,6 +9851,19 @@ class B(str): ...
         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 dbc8734418d9a9..434cd0370e099a 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 00000000000000..9eed50ec20a8f6
--- /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.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to