Skip to content
Prev Previous commit
Next Next commit
Check that generic is not a ForwardRef before accessing its attrs
  • Loading branch information
dr-carlos committed Sep 3, 2025
commit fd29f95783c7437024671e70eff3f2c387dc3228
21 changes: 12 additions & 9 deletions Lib/test/test_annotationlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -1677,18 +1677,21 @@ def test_name_lookup_without_eval(self):

def test_evaluate_undefined_generic(self):
# Test the codepath where have to eval() with undefined variables.
Comment thread
dr-carlos marked this conversation as resolved.
fwdref = ForwardRef("glob[int, undef]").evaluate(format=Format.FORWARDREF, globals={"glob": dict})
self.assertIs(fwdref.__origin__, dict)
self.assertIs(fwdref.__args__[0], int)
generic = ForwardRef("glob[int, undef]").evaluate(format=Format.FORWARDREF, globals={"glob": dict})
self.assertNotIsInstance(generic, ForwardRef)
self.assertIs(generic.__origin__, dict)
self.assertIs(generic.__args__[0], int)

fwdref = ForwardRef("loc[int, undef]").evaluate(format=Format.FORWARDREF, locals={"loc": dict})
self.assertIs(fwdref.__origin__, dict)
self.assertIs(fwdref.__args__[0], int)
generic = ForwardRef("loc[int, undef]").evaluate(format=Format.FORWARDREF, locals={"loc": dict})
self.assertNotIsInstance(generic, ForwardRef)
self.assertIs(generic.__origin__, dict)
self.assertIs(generic.__args__[0], int)

# Ensure that globals overwrite builtins
fwdref = ForwardRef("list[int, undef]").evaluate(format=Format.FORWARDREF, globals={"list": dict})
self.assertIs(fwdref.__origin__, dict)
self.assertIs(fwdref.__args__[0], int)
generic = ForwardRef("list[int, undef]").evaluate(format=Format.FORWARDREF, globals={"list": dict})
self.assertNotIsInstance(generic, ForwardRef)
self.assertIs(generic.__origin__, dict)
self.assertIs(generic.__args__[0], int)
Comment thread
dr-carlos marked this conversation as resolved.

def test_fwdref_invalid_syntax(self):
fr = ForwardRef("if")
Expand Down