From 13a5082afea155b8558c700156e3832548d78b3a Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sat, 15 Jun 2024 15:16:40 +0200 Subject: [PATCH] [3.13] Add some more edge-case tests for `inspect.get_annotations` with `eval_str=True` (GH-120550) (#120551) Co-authored-by: Alex Waygood --- .../inspect_stringized_annotations_pep695.py | 23 ++++++++++++++---- Lib/test/test_inspect/test_inspect.py | 24 +++++++++++++------ 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_inspect/inspect_stringized_annotations_pep695.py b/Lib/test/test_inspect/inspect_stringized_annotations_pep695.py index 723822f8eaa92d..39bfe2edb03f30 100644 --- a/Lib/test/test_inspect/inspect_stringized_annotations_pep695.py +++ b/Lib/test/test_inspect/inspect_stringized_annotations_pep695.py @@ -45,6 +45,13 @@ def generic_method[Foo, **Bar]( def generic_method_2[Eggs, **Spam](self, x: Eggs, y: Spam): pass +# Eggs is `int` in globals, a TypeVar in type_params, and `str` in locals: +class E[Eggs]: + Eggs = str + x: Eggs + + + def nested(): from types import SimpleNamespace from inspect import get_annotations @@ -53,7 +60,7 @@ def nested(): Spam = memoryview - class E[Eggs, **Spam]: + class F[Eggs, **Spam]: x: Eggs y: Spam @@ -63,10 +70,18 @@ def generic_method[Eggs, **Spam](self, x: Eggs, y: Spam): pass def generic_function[Eggs, **Spam](x: Eggs, y: Spam): pass + # Eggs is `int` in globals, `bytes` in the function scope, + # a TypeVar in the type_params, and `str` in locals: + class G[Eggs]: + Eggs = str + x: Eggs + + return SimpleNamespace( - E=E, - E_annotations=get_annotations(E, eval_str=True), - E_meth_annotations=get_annotations(E.generic_method, eval_str=True), + F=F, + F_annotations=get_annotations(F, eval_str=True), + F_meth_annotations=get_annotations(F.generic_method, eval_str=True), + G_annotations=get_annotations(G, eval_str=True), generic_func=generic_function, generic_func_annotations=get_annotations(generic_function, eval_str=True) ) diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py index 335dda66aba4cb..fff0e5463b8266 100644 --- a/Lib/test/test_inspect/test_inspect.py +++ b/Lib/test/test_inspect/test_inspect.py @@ -1770,26 +1770,36 @@ def test_pep_695_generic_method_with_future_annotations_name_clash_with_global_v ) ) + def test_pep_695_generic_method_with_future_annotations_name_clash_with_global_and_local_vars(self): + self.assertEqual( + inspect.get_annotations( + inspect_stringized_annotations_pep695.E, eval_str=True + ), + {"x": str}, + ) + def test_pep_695_generics_with_future_annotations_nested_in_function(self): results = inspect_stringized_annotations_pep695.nested() self.assertEqual( - set(results.E_annotations.values()), - set(results.E.__type_params__) + set(results.F_annotations.values()), + set(results.F.__type_params__) ) self.assertEqual( - set(results.E_meth_annotations.values()), - set(results.E.generic_method.__type_params__) + set(results.F_meth_annotations.values()), + set(results.F.generic_method.__type_params__) ) self.assertNotEqual( - set(results.E_meth_annotations.values()), - set(results.E.__type_params__) + set(results.F_meth_annotations.values()), + set(results.F.__type_params__) ) self.assertEqual( - set(results.E_meth_annotations.values()).intersection(results.E.__type_params__), + set(results.F_meth_annotations.values()).intersection(results.F.__type_params__), set() ) + self.assertEqual(results.G_annotations, {"x": str}) + self.assertEqual( set(results.generic_func_annotations.values()), set(results.generic_func.__type_params__)