[3.13] GH-120097: Make FrameLocalsProxy a mapping (GH-120101) (GH-120749)

Co-authored-by: Alyssa Coghlan <ncoghlan@gmail.com>
This commit is contained in:
Miss Islington (bot) 2024-08-23 11:26:03 +02:00 committed by GitHub
parent fda8aec625
commit 95b4f9c9ad
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 20 additions and 1 deletions

View File

@ -85,6 +85,10 @@ dict_values = type({}.values())
dict_items = type({}.items()) dict_items = type({}.items())
## misc ## ## misc ##
mappingproxy = type(type.__dict__) mappingproxy = type(type.__dict__)
def _get_framelocalsproxy():
return type(sys._getframe().f_locals)
framelocalsproxy = _get_framelocalsproxy()
del _get_framelocalsproxy
generator = type((lambda: (yield))()) generator = type((lambda: (yield))())
## coroutine ## ## coroutine ##
async def _coro(): pass async def _coro(): pass
@ -836,6 +840,7 @@ class Mapping(Collection):
__reversed__ = None __reversed__ = None
Mapping.register(mappingproxy) Mapping.register(mappingproxy)
Mapping.register(framelocalsproxy)
class MappingView(Sized): class MappingView(Sized):

View File

@ -13,6 +13,7 @@ try:
except ImportError: except ImportError:
_testcapi = None _testcapi = None
from collections.abc import Mapping
from test import support from test import support
from test.support import import_helper, threading_helper, Py_GIL_DISABLED from test.support import import_helper, threading_helper, Py_GIL_DISABLED
from test.support.script_helper import assert_python_ok from test.support.script_helper import assert_python_ok
@ -421,6 +422,17 @@ class TestFrameLocals(unittest.TestCase):
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
copy.deepcopy(d) copy.deepcopy(d)
def test_is_mapping(self):
x = 1
d = sys._getframe().f_locals
self.assertIsInstance(d, Mapping)
match d:
case {"x": value}:
self.assertEqual(value, 1)
kind = "mapping"
case _:
kind = "other"
self.assertEqual(kind, "mapping")
def _x_stringlikes(self): def _x_stringlikes(self):
class StringSubclass(str): class StringSubclass(str):

View File

@ -0,0 +1,2 @@
``FrameLocalsProxy`` now subclasses ``collections.abc.Mapping`` and can be
matched as a mapping in ``match`` statements

View File

@ -740,7 +740,7 @@ PyTypeObject PyFrameLocalsProxy_Type = {
.tp_as_mapping = &framelocalsproxy_as_mapping, .tp_as_mapping = &framelocalsproxy_as_mapping,
.tp_getattro = PyObject_GenericGetAttr, .tp_getattro = PyObject_GenericGetAttr,
.tp_setattro = PyObject_GenericSetAttr, .tp_setattro = PyObject_GenericSetAttr,
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_MAPPING,
.tp_traverse = framelocalsproxy_visit, .tp_traverse = framelocalsproxy_visit,
.tp_clear = framelocalsproxy_tp_clear, .tp_clear = framelocalsproxy_tp_clear,
.tp_richcompare = framelocalsproxy_richcompare, .tp_richcompare = framelocalsproxy_richcompare,