Skip to content

Commit 395a2e7

Browse files
gh-157056: Expand STRING-format edge-case tests
1 parent c983976 commit 395a2e7

1 file changed

Lines changed: 49 additions & 1 deletion

File tree

‎Lib/test/test_annotationlib_string_special.py‎

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""STRING-format edge cases for annotationlib (gh-157056)."""
22

3+
import inspect
34
import unittest
5+
from unittest.mock import patch
46

57
from annotationlib import Format, get_annotations, type_repr
68

@@ -44,8 +46,54 @@ def mixed(a: int, b: {k: v for k, v in items}, c: lambda q: q):
4446
},
4547
)
4648

49+
def test_quoted_annotation_not_requoted_on_unpack_fallback(self):
50+
def f(a: "int", b: {k: v for k, v in items}):
51+
pass
52+
53+
self.assertEqual(
54+
get_annotations(f, format=Format.STRING),
55+
{"a": "int", "b": "{k: v for k, v in items}"},
56+
)
57+
58+
def test_nested_lambda_uses_source_and_has_no_address(self):
59+
def f(x: [lambda q: q]):
60+
pass
61+
62+
anno = get_annotations(f, format=Format.STRING)
63+
self.assertEqual(anno, {"x": "[lambda q: q]"})
64+
self.assertNotIn("0x", anno["x"].lower())
65+
66+
def test_class_dictcomp_keeps_conditional_annotations(self):
67+
class C:
68+
a: int
69+
b: {k: v for k, v in items}
70+
if True:
71+
c: str
72+
73+
self.assertEqual(
74+
get_annotations(C, format=Format.STRING),
75+
{"a": "int", "b": "{k: v for k, v in items}", "c": "str"},
76+
)
77+
78+
def test_simple_string_format_does_not_read_source(self):
79+
def f(x: int) -> str:
80+
pass
81+
82+
with patch.object(inspect, "getsource") as mocked:
83+
self.assertEqual(
84+
get_annotations(f, format=Format.STRING),
85+
{"x": "int", "return": "str"},
86+
)
87+
mocked.assert_not_called()
88+
89+
def test_exec_without_source_still_raises_on_dictcomp(self):
90+
ns = {}
91+
exec("def f(x: {k: v for k, v in items}): pass", ns)
92+
with self.assertRaises(ValueError):
93+
get_annotations(ns["f"], format=Format.STRING)
94+
4795
def test_type_repr_lambda_and_genexpr_have_no_address(self):
48-
lam = lambda q: q
96+
lam = (lambda q: q)
4997
self.assertTrue(type_repr(lam).endswith("<lambda>"))
5098
self.assertNotIn("0x", type_repr(lam).lower())
5199
gen = (w for w in ())

0 commit comments

Comments
 (0)