diff options
author | Jelle Zijlstra <jelle.zijlstra@gmail.com> | 2024-08-11 16:42:57 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-11 23:42:57 +0000 |
commit | 016f4b5975a251d353c6e9d399b2b6a234735f25 (patch) | |
tree | 359d03dfe085969e54037c3fce9e1b03f591b4e0 /Lib/test/test_annotationlib.py | |
parent | a6644d446416dbe3eab26839a32f79c4e73d3aeb (diff) | |
download | cpython-016f4b5975a251d353c6e9d399b2b6a234735f25.tar.gz cpython-016f4b5975a251d353c6e9d399b2b6a234735f25.zip |
gh-119180: Improvements to ForwardRef.evaluate (#122210)
Noticed some issues while writing documentation for this method.
Diffstat (limited to 'Lib/test/test_annotationlib.py')
-rw-r--r-- | Lib/test/test_annotationlib.py | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index e4dcdb6b58d..db8350c2746 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -5,7 +5,7 @@ import functools import itertools import pickle import unittest -from annotationlib import Format, get_annotations, get_annotate_function +from annotationlib import Format, ForwardRef, get_annotations, get_annotate_function from typing import Unpack from test.test_inspect import inspect_stock_annotations @@ -250,6 +250,46 @@ class TestForwardRefClass(unittest.TestCase): with self.assertRaises(TypeError): pickle.dumps(fr, proto) + def test_evaluate_with_type_params(self): + class Gen[T]: + alias = int + + with self.assertRaises(NameError): + ForwardRef("T").evaluate() + with self.assertRaises(NameError): + ForwardRef("T").evaluate(type_params=()) + with self.assertRaises(NameError): + ForwardRef("T").evaluate(owner=int) + + T, = Gen.__type_params__ + self.assertIs(ForwardRef("T").evaluate(type_params=Gen.__type_params__), T) + self.assertIs(ForwardRef("T").evaluate(owner=Gen), T) + + with self.assertRaises(NameError): + ForwardRef("alias").evaluate(type_params=Gen.__type_params__) + self.assertIs(ForwardRef("alias").evaluate(owner=Gen), int) + # If you pass custom locals, we don't look at the owner's locals + with self.assertRaises(NameError): + ForwardRef("alias").evaluate(owner=Gen, locals={}) + # But if the name exists in the locals, it works + self.assertIs( + ForwardRef("alias").evaluate(owner=Gen, locals={"alias": str}), str + ) + + def test_fwdref_with_module(self): + self.assertIs(ForwardRef("Format", module=annotationlib).evaluate(), Format) + + with self.assertRaises(NameError): + # If globals are passed explicitly, we don't look at the module dict + ForwardRef("Format", module=annotationlib).evaluate(globals={}) + + def test_fwdref_value_is_cached(self): + fr = ForwardRef("hello") + with self.assertRaises(NameError): + fr.evaluate() + self.assertIs(fr.evaluate(globals={"hello": str}), str) + self.assertIs(fr.evaluate(), str) + class TestGetAnnotations(unittest.TestCase): def test_builtin_type(self): |