self._check_in_scopes(code, {"x": 2, "y": [3]}, ns={"x": 3}, scopes=["class"])
self._check_in_scopes(code, {"x": 2, "y": [2]}, ns={"x": 3}, scopes=["function", "module"])
+ def test_name_collision_locals(self):
+ # GH-130809: The existence of a hidden fast from list comprehension
+ # should not cause frame.f_locals on module level to return a new dict
+ # every time it is accessed.
+
+ code = """
+ import sys
+ frame = sys._getframe()
+ f_locals = frame.f_locals
+ foo = 1
+ [foo for foo in [0]]
+ # calls _PyFrame_LocalsToFast which triggers the issue
+ from abc import *
+ same_f_locals = frame.f_locals is f_locals
+ """
+ self._check_in_scopes(code, {"foo": 1, "same_f_locals": True}, scopes=["module"])
+
def test_exception_locations(self):
# The location of an exception raised from __init__ or
# __next__ should should be the iterator expression
if (kind & CO_FAST_FREE && !(co->co_flags & CO_OPTIMIZED)) {
continue;
}
+ if (kind & CO_FAST_HIDDEN) {
+ continue;
+ }
PyObject *name = PyTuple_GET_ITEM(co->co_localsplusnames, i);
PyObject *value = PyObject_GetItem(locals, name);
/* We only care about NULLs if clear is true. */