mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
[3.14] gh-138425: Correctly partially evaluate global generics with undefined params in ref.evaluate(format=Format.FORWARDREF) (GH-138430) (#140927)
gh-138425: Correctly partially evaluate global generics with undefined params in `ref.evaluate(format=Format.FORWARDREF)` (GH-138430)
(cherry picked from commit e66f87ca73)
Co-authored-by: dr-carlos <77367421+dr-carlos@users.noreply.github.com>
Co-authored-by: sobolevn <mail@sobolevn.me>
This commit is contained in:
parent
7e1bac6a1a
commit
23e3771045
3 changed files with 32 additions and 1 deletions
|
|
@ -1877,6 +1877,32 @@ def test_name_lookup_without_eval(self):
|
|||
|
||||
self.assertEqual(exc.exception.name, "doesntexist")
|
||||
|
||||
def test_evaluate_undefined_generic(self):
|
||||
# Test the codepath where have to eval() with undefined variables.
|
||||
class C:
|
||||
x: alias[int, undef]
|
||||
|
||||
generic = get_annotations(C, format=Format.FORWARDREF)["x"].evaluate(
|
||||
format=Format.FORWARDREF,
|
||||
globals={"alias": dict}
|
||||
)
|
||||
self.assertNotIsInstance(generic, ForwardRef)
|
||||
self.assertIs(generic.__origin__, dict)
|
||||
self.assertEqual(len(generic.__args__), 2)
|
||||
self.assertIs(generic.__args__[0], int)
|
||||
self.assertIsInstance(generic.__args__[1], ForwardRef)
|
||||
|
||||
generic = get_annotations(C, format=Format.FORWARDREF)["x"].evaluate(
|
||||
format=Format.FORWARDREF,
|
||||
globals={"alias": Union},
|
||||
locals={"alias": dict}
|
||||
)
|
||||
self.assertNotIsInstance(generic, ForwardRef)
|
||||
self.assertIs(generic.__origin__, dict)
|
||||
self.assertEqual(len(generic.__args__), 2)
|
||||
self.assertIs(generic.__args__[0], int)
|
||||
self.assertIsInstance(generic.__args__[1], ForwardRef)
|
||||
|
||||
def test_fwdref_invalid_syntax(self):
|
||||
fr = ForwardRef("if")
|
||||
with self.assertRaises(SyntaxError):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue