aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test/test_annotationlib.py
diff options
context:
space:
mode:
authorJelle Zijlstra <jelle.zijlstra@gmail.com>2024-08-11 16:42:57 -0700
committerGitHub <noreply@github.com>2024-08-11 23:42:57 +0000
commit016f4b5975a251d353c6e9d399b2b6a234735f25 (patch)
tree359d03dfe085969e54037c3fce9e1b03f591b4e0 /Lib/test/test_annotationlib.py
parenta6644d446416dbe3eab26839a32f79c4e73d3aeb (diff)
downloadcpython-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.py42
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):