Skip to content
Prev Previous commit
Next Next commit
Don't mutate globals!
  • Loading branch information
AlexWaygood committed Jun 9, 2024
commit 5505d971a667cdcc10c31ace527f411e22112213
5 changes: 5 additions & 0 deletions Lib/test/test_typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -4859,6 +4859,8 @@ def f(x: X): ...
)

def test_pep695_generic_with_future_annotations(self):
original_globals = dict(ann_module695.__dict__)

hints_for_A = get_type_hints(ann_module695.A)
A_type_params = ann_module695.A.__type_params__
self.assertIs(hints_for_A["x"], A_type_params[0])
Expand Down Expand Up @@ -4898,6 +4900,9 @@ def test_pep695_generic_with_future_annotations(self):
{"x": params["Foo"], "y": params["Bar"], "return": types.NoneType}
)

# should not have changed as a result of the get_type_hints() calls!
self.assertEqual(ann_module695.__dict__, original_globals)

def test_extended_generic_rules_subclassing(self):
class T1(Tuple[T, KT]): ...
class T2(Tuple[T, ...]): ...
Expand Down
18 changes: 10 additions & 8 deletions Lib/typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -1068,14 +1068,16 @@ def _evaluate(self, globalns, localns, type_params=_sentinel, *, recursive_guard
# names in the global scope (which here are called `localns`!),
# but should in turn be overridden by names in the class scope
# (which here are called `globalns`!)
type_params = {param.__name__: param for param in type_params}
if self.__forward_is_class__:
for name, param in type_params.items():
if name not in globalns:
globalns[name] = param
localns.pop(name, None)
else:
localns = type_params | localns
if type_params:
name_to_param_map = {param.__name__: param for param in type_params}
if self.__forward_is_class__:
globalns, localns = dict(globalns), dict(localns)
for name, param in name_to_param_map.items():
if name not in globalns:
globalns[name] = param
localns.pop(name, None)
else:
localns = name_to_param_map | localns

type_ = _type_check(
eval(self.__forward_code__, globalns, localns),
Expand Down