mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
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:
parent
3b6bfa77aa
commit
96f619faa7
3 changed files with 45 additions and 1 deletions
|
@ -575,7 +575,11 @@ def get_annotate_function(obj):
|
||||||
Returns the __annotate__ function or None.
|
Returns the __annotate__ function or None.
|
||||||
"""
|
"""
|
||||||
if isinstance(obj, type):
|
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)
|
return getattr(obj, "__annotate__", None)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -928,6 +928,27 @@ class MetaclassTests(unittest.TestCase):
|
||||||
self.assertIs(annotate_func, None)
|
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):
|
class TestAnnotationLib(unittest.TestCase):
|
||||||
def test__all__(self):
|
def test__all__(self):
|
||||||
support.check__all__(self, annotationlib)
|
support.check__all__(self, annotationlib)
|
||||||
|
|
|
@ -7043,6 +7043,25 @@ class GetTypeHintTests(BaseTestCase):
|
||||||
self.assertEqual(get_type_hints(g), {'x': collections.abc.Callable[..., int]})
|
self.assertEqual(get_type_hints(g), {'x': collections.abc.Callable[..., int]})
|
||||||
self.assertEqual(get_type_hints(h), {'x': collections.abc.Callable[P, 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):
|
class GetUtilitiesTestCase(TestCase):
|
||||||
def test_get_origin(self):
|
def test_get_origin(self):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue