[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 7e652f402f)

Co-authored-by: David Ellis <ducksual@gmail.com>
This commit is contained in:
Miss Islington (bot) 2025-10-08 06:23:47 +02:00 committed by GitHub
parent ed0e63fd0a
commit dd5d86c7d5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 17 additions and 1 deletions

View file

@ -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):

View file

@ -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:

View file

@ -0,0 +1 @@
Fix the partial evaluation of annotations that use ``typing.Annotated[T, x]`` where ``T`` is a forward reference.