gh-124206: Fix calling get_annotate_function() on static types (#124208)

Fixes #124206. No news entry because the bug this fixes was never
released.
This commit is contained in:
Jelle Zijlstra 2024-09-18 08:39:22 -07:00 committed by GitHub
parent 3b6bfa77aa
commit 96f619faa7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 45 additions and 1 deletions

View File

@ -575,7 +575,11 @@ def get_annotate_function(obj):
Returns the __annotate__ function or None.
"""
if isinstance(obj, type):
return _BASE_GET_ANNOTATE(obj)
try:
return _BASE_GET_ANNOTATE(obj)
except AttributeError:
# AttributeError is raised for static types.
return None
return getattr(obj, "__annotate__", None)

View File

@ -928,6 +928,27 @@ class MetaclassTests(unittest.TestCase):
self.assertIs(annotate_func, None)
class TestGetAnnotateFunction(unittest.TestCase):
def test_static_class(self):
self.assertIsNone(get_annotate_function(object))
self.assertIsNone(get_annotate_function(int))
def test_unannotated_class(self):
class C:
pass
self.assertIsNone(get_annotate_function(C))
D = type("D", (), {})
self.assertIsNone(get_annotate_function(D))
def test_annotated_class(self):
class C:
a: int
self.assertEqual(get_annotate_function(C)(Format.VALUE), {"a": int})
class TestAnnotationLib(unittest.TestCase):
def test__all__(self):
support.check__all__(self, annotationlib)

View File

@ -7043,6 +7043,25 @@ class GetTypeHintTests(BaseTestCase):
self.assertEqual(get_type_hints(g), {'x': collections.abc.Callable[..., int]})
self.assertEqual(get_type_hints(h), {'x': collections.abc.Callable[P, int]})
def test_get_type_hints_format(self):
class C:
x: undefined
with self.assertRaises(NameError):
get_type_hints(C)
with self.assertRaises(NameError):
get_type_hints(C, format=annotationlib.Format.VALUE)
annos = get_type_hints(C, format=annotationlib.Format.FORWARDREF)
self.assertIsInstance(annos, dict)
self.assertEqual(list(annos), ['x'])
self.assertIsInstance(annos['x'], annotationlib.ForwardRef)
self.assertEqual(annos['x'].__arg__, 'undefined')
self.assertEqual(get_type_hints(C, format=annotationlib.Format.SOURCE),
{'x': 'undefined'})
class GetUtilitiesTestCase(TestCase):
def test_get_origin(self):