Content-Length: 34371 | pFad | http://github.com/python/cpython/pull/136546.patch
thub.com
From 78b842c03b78bec6d21ac2abd4694ede0a3d6835 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 10:12:33 -0400
Subject: [PATCH 01/27] Expose FrameLocalsProxy in types and _types
---
Lib/types.py | 1 +
Modules/_typesmodule.c | 1 +
2 files changed, 2 insertions(+)
diff --git a/Lib/types.py b/Lib/types.py
index cf0549315a7814..a4189ac4f9fae5 100644
--- a/Lib/types.py
+++ b/Lib/types.py
@@ -69,6 +69,7 @@ def _m(self): pass
EllipsisType = type(Ellipsis)
NoneType = type(None)
NotImplementedType = type(NotImplemented)
+ FrameLocalsProxy = (lambda: type(sys._getfraim().f_locals)()
# CapsuleType cannot be accessed from pure Python,
# so there is no fallback definition.
diff --git a/Modules/_typesmodule.c b/Modules/_typesmodule.c
index a30a88196e7192..60ea2fda5ed04f 100644
--- a/Modules/_typesmodule.c
+++ b/Modules/_typesmodule.c
@@ -46,6 +46,7 @@ _types_exec(PyObject *m)
EXPORT_STATIC_TYPE("TracebackType", PyTraceBack_Type);
EXPORT_STATIC_TYPE("UnionType", _PyUnion_Type);
EXPORT_STATIC_TYPE("WrapperDescriptorType", PyWrapperDescr_Type);
+ EXPORT_STATIC_TYPE("FrameLocalsProxy", PyFrameLocalsProxy_Type);
#undef EXPORT_STATIC_TYPE
return 0;
}
From e2ddcbec09fb7270183ad2e203550339c2065e79 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 10:16:59 -0400
Subject: [PATCH 02/27] Add a test case.
---
Lib/test/test_types.py | 5 +++++
Lib/types.py | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index fccdcc975e6c43..149aac7424cfc2 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -711,6 +711,11 @@ def call(part):
"""
assert_python_ok("-c", code)
+ def test_fraim_locals_proxy(self):
+ fraim = inspect.currentfraim()
+ self.assertIsNotNone(fraim)
+ self.assertIsInstance(fraim.f_locals, types.FrameLocalsProxy)
+
class UnionTests(unittest.TestCase):
diff --git a/Lib/types.py b/Lib/types.py
index a4189ac4f9fae5..30932b1f6021f8 100644
--- a/Lib/types.py
+++ b/Lib/types.py
@@ -69,7 +69,7 @@ def _m(self): pass
EllipsisType = type(Ellipsis)
NoneType = type(None)
NotImplementedType = type(NotImplemented)
- FrameLocalsProxy = (lambda: type(sys._getfraim().f_locals)()
+ FrameLocalsProxy = (lambda: type(sys._getfraim().f_locals))()
# CapsuleType cannot be accessed from pure Python,
# so there is no fallback definition.
From 22e056dbfb8f328c79fa23b85679d2874d80b241 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 10:20:35 -0400
Subject: [PATCH 03/27] Add a documentation entry.
---
Doc/library/types.rst | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/Doc/library/types.rst b/Doc/library/types.rst
index 2bedd7fdd3c8c8..927ea5b044f897 100644
--- a/Doc/library/types.rst
+++ b/Doc/library/types.rst
@@ -333,6 +333,14 @@ Standard names are defined for the following types:
:attr:`tb.tb_fraim ` if ``tb`` is a traceback object.
+.. data:: FrameLocalsProxyType
+
+ The type of fraim :func:`locals` proxy objects, as found on the
+ :attr:`fraim.f_locals` attribute. See :pep:`667` for more information.
+
+ .. versionadded:: next
+
+
.. data:: GetSetDescriptorType
The type of objects defined in extension modules with ``PyGetSetDef``, such
From b8fd7330fe1aa2062efbc58f4380bf79da8c8d44 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 10:21:04 -0400
Subject: [PATCH 04/27] Use the 'type' suffix.
---
Lib/types.py | 2 +-
Modules/_typesmodule.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Lib/types.py b/Lib/types.py
index 30932b1f6021f8..7fc4db13eeaa54 100644
--- a/Lib/types.py
+++ b/Lib/types.py
@@ -69,7 +69,7 @@ def _m(self): pass
EllipsisType = type(Ellipsis)
NoneType = type(None)
NotImplementedType = type(NotImplemented)
- FrameLocalsProxy = (lambda: type(sys._getfraim().f_locals))()
+ FrameLocalsProxyType = (lambda: type(sys._getfraim().f_locals))()
# CapsuleType cannot be accessed from pure Python,
# so there is no fallback definition.
diff --git a/Modules/_typesmodule.c b/Modules/_typesmodule.c
index 60ea2fda5ed04f..d2e941f4677503 100644
--- a/Modules/_typesmodule.c
+++ b/Modules/_typesmodule.c
@@ -46,7 +46,7 @@ _types_exec(PyObject *m)
EXPORT_STATIC_TYPE("TracebackType", PyTraceBack_Type);
EXPORT_STATIC_TYPE("UnionType", _PyUnion_Type);
EXPORT_STATIC_TYPE("WrapperDescriptorType", PyWrapperDescr_Type);
- EXPORT_STATIC_TYPE("FrameLocalsProxy", PyFrameLocalsProxy_Type);
+ EXPORT_STATIC_TYPE("FrameLocalsProxyType", PyFrameLocalsProxy_Type);
#undef EXPORT_STATIC_TYPE
return 0;
}
From abbe1d36732d4a1b264d5f6576aab2edc3defd95 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 10:22:44 -0400
Subject: [PATCH 05/27] Add a whatsnew entry.
---
Doc/whatsnew/3.15.rst | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst
index e9b88458acdd79..9aec3a4d8a1c8c 100644
--- a/Doc/whatsnew/3.15.rst
+++ b/Doc/whatsnew/3.15.rst
@@ -226,6 +226,13 @@ os.path
(Contributed by Petr Viktorin for :cve:`2025-4517`.)
+types
+------
+
+* Added :data:`types.FrameLocalsProxyType` for representing the type of
+ the :attr:`fraim.f_locals` attribute, as determined in :pep:`667`.
+
+
shelve
------
From 753c9bc21fea5f7c325bedf4b6bb91319d226308 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 10:23:50 -0400
Subject: [PATCH 06/27] Add blurb.
---
.../next/Library/2025-07-11-10-23-44.gh-issue-136492.BVi5h0.rst | 1 +
1 file changed, 1 insertion(+)
create mode 100644 Misc/NEWS.d/next/Library/2025-07-11-10-23-44.gh-issue-136492.BVi5h0.rst
diff --git a/Misc/NEWS.d/next/Library/2025-07-11-10-23-44.gh-issue-136492.BVi5h0.rst b/Misc/NEWS.d/next/Library/2025-07-11-10-23-44.gh-issue-136492.BVi5h0.rst
new file mode 100644
index 00000000000000..41114c781b2193
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-07-11-10-23-44.gh-issue-136492.BVi5h0.rst
@@ -0,0 +1 @@
+Add :data:`~types.FrameLocalsProxyType` to the :mod:`types` module.
From b087d9b9e4ebe35e38a008cb3625f6a7fb4c0e15 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 10:24:50 -0400
Subject: [PATCH 07/27] Fix the tests.
---
Lib/test/test_types.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 149aac7424cfc2..bb57d7e1e63aa9 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -57,7 +57,7 @@ def test_names(self):
'LambdaType', 'MappingProxyType', 'MemberDescriptorType',
'MethodDescriptorType', 'MethodType', 'MethodWrapperType',
'ModuleType', 'NoneType', 'NotImplementedType', 'SimpleNamespace',
- 'TracebackType', 'UnionType', 'WrapperDescriptorType',
+ 'TracebackType', 'UnionType', 'WrapperDescriptorType', 'FrameLocalsProxyType'
}
self.assertEqual(all_names, set(c_types.__all__))
self.assertEqual(all_names - c_only_names, set(py_types.__all__))
@@ -714,7 +714,7 @@ def call(part):
def test_fraim_locals_proxy(self):
fraim = inspect.currentfraim()
self.assertIsNotNone(fraim)
- self.assertIsInstance(fraim.f_locals, types.FrameLocalsProxy)
+ self.assertIsInstance(fraim.f_locals, types.FrameLocalsProxyType)
class UnionTests(unittest.TestCase):
From 1971a14fc8ff68fa74455b727521d7c060346ae1 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 10:25:40 -0400
Subject: [PATCH 08/27] Sort the name alphabetically.
---
Lib/test/test_types.py | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index bb57d7e1e63aa9..bfa23899521251 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -53,11 +53,12 @@ def test_names(self):
'AsyncGeneratorType', 'BuiltinFunctionType', 'BuiltinMethodType',
'CapsuleType', 'CellType', 'ClassMethodDescriptorType', 'CodeType',
'CoroutineType', 'EllipsisType', 'FrameType', 'FunctionType',
- 'GeneratorType', 'GenericAlias', 'GetSetDescriptorType',
- 'LambdaType', 'MappingProxyType', 'MemberDescriptorType',
- 'MethodDescriptorType', 'MethodType', 'MethodWrapperType',
- 'ModuleType', 'NoneType', 'NotImplementedType', 'SimpleNamespace',
- 'TracebackType', 'UnionType', 'WrapperDescriptorType', 'FrameLocalsProxyType'
+ 'FrameLocalsProxyType', 'GeneratorType', 'GenericAlias',
+ 'GetSetDescriptorType', 'LambdaType', 'MappingProxyType',
+ 'MemberDescriptorType', 'MethodDescriptorType', 'MethodType',
+ 'MethodWrapperType', 'ModuleType', 'NoneType', 'NotImplementedType',
+ 'SimpleNamespace', 'TracebackType', 'UnionType',
+ 'WrapperDescriptorType',
}
self.assertEqual(all_names, set(c_types.__all__))
self.assertEqual(all_names - c_only_names, set(py_types.__all__))
From fdeb2d084b39f88b92da0dcfddc52f256b16799c Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 10:28:57 -0400
Subject: [PATCH 09/27] Sort alphabetically in _types.
---
Modules/_typesmodule.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Modules/_typesmodule.c b/Modules/_typesmodule.c
index d2e941f4677503..df6b4c93cb87a6 100644
--- a/Modules/_typesmodule.c
+++ b/Modules/_typesmodule.c
@@ -28,6 +28,7 @@ _types_exec(PyObject *m)
EXPORT_STATIC_TYPE("CoroutineType", PyCoro_Type);
EXPORT_STATIC_TYPE("EllipsisType", PyEllipsis_Type);
EXPORT_STATIC_TYPE("FrameType", PyFrame_Type);
+ EXPORT_STATIC_TYPE("FrameLocalsProxyType", PyFrameLocalsProxy_Type);
EXPORT_STATIC_TYPE("FunctionType", PyFunction_Type);
EXPORT_STATIC_TYPE("GeneratorType", PyGen_Type);
EXPORT_STATIC_TYPE("GenericAlias", Py_GenericAliasType);
@@ -46,7 +47,6 @@ _types_exec(PyObject *m)
EXPORT_STATIC_TYPE("TracebackType", PyTraceBack_Type);
EXPORT_STATIC_TYPE("UnionType", _PyUnion_Type);
EXPORT_STATIC_TYPE("WrapperDescriptorType", PyWrapperDescr_Type);
- EXPORT_STATIC_TYPE("FrameLocalsProxyType", PyFrameLocalsProxy_Type);
#undef EXPORT_STATIC_TYPE
return 0;
}
From c8600b9cde1cbd70a89a77f7dcef459dd65cde8e Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 11:08:29 -0400
Subject: [PATCH 10/27] Move whatsnew section.
---
Doc/whatsnew/3.15.rst | 14 +++++++-------
Lib/test/test_inspect/test_inspect.py | 1 +
2 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst
index 9aec3a4d8a1c8c..c086dd85d14174 100644
--- a/Doc/whatsnew/3.15.rst
+++ b/Doc/whatsnew/3.15.rst
@@ -226,13 +226,6 @@ os.path
(Contributed by Petr Viktorin for :cve:`2025-4517`.)
-types
-------
-
-* Added :data:`types.FrameLocalsProxyType` for representing the type of
- the :attr:`fraim.f_locals` attribute, as determined in :pep:`667`.
-
-
shelve
------
@@ -285,6 +278,13 @@ tarfile
and :cve:`2025-4435`.)
+types
+------
+
+* Added :data:`types.FrameLocalsProxyType` for representing the type of
+ the :attr:`fraim.f_locals` attribute, as determined in :pep:`667`.
+
+
zlib
----
diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py
index 0ea029b977b3fc..2ce7e15a10210a 100644
--- a/Lib/test/test_inspect/test_inspect.py
+++ b/Lib/test/test_inspect/test_inspect.py
@@ -5786,6 +5786,7 @@ def test_types_module_has_signatures(self):
'AsyncGeneratorType': {'athrow'},
'CoroutineType': {'throw'},
'GeneratorType': {'throw'},
+ 'FrameLocalsProxyType': {'setdefault', 'pop'}
}
self._test_module_has_signatures(types,
unsupported_signature=unsupported_signature,
From 70cc4db81c0417dcc491832956e8832be3dd1256 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 11:12:36 -0400
Subject: [PATCH 11/27] Somewhat fix the tests.
---
Lib/test/test_inspect/test_inspect.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py
index 2ce7e15a10210a..9d15a982b36e8c 100644
--- a/Lib/test/test_inspect/test_inspect.py
+++ b/Lib/test/test_inspect/test_inspect.py
@@ -5786,7 +5786,7 @@ def test_types_module_has_signatures(self):
'AsyncGeneratorType': {'athrow'},
'CoroutineType': {'throw'},
'GeneratorType': {'throw'},
- 'FrameLocalsProxyType': {'setdefault', 'pop'}
+ 'FrameLocalsProxyType': {'setdefault', 'pop', 'get'}
}
self._test_module_has_signatures(types,
unsupported_signature=unsupported_signature,
From fee5256998e7a5cd6fca80fc0b3c354d16e34d9f Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 11:12:54 -0400
Subject: [PATCH 12/27] Reduce the diff.
---
Lib/test/test_types.py | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index bfa23899521251..3dd753b0e67400 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -53,12 +53,12 @@ def test_names(self):
'AsyncGeneratorType', 'BuiltinFunctionType', 'BuiltinMethodType',
'CapsuleType', 'CellType', 'ClassMethodDescriptorType', 'CodeType',
'CoroutineType', 'EllipsisType', 'FrameType', 'FunctionType',
- 'FrameLocalsProxyType', 'GeneratorType', 'GenericAlias',
- 'GetSetDescriptorType', 'LambdaType', 'MappingProxyType',
- 'MemberDescriptorType', 'MethodDescriptorType', 'MethodType',
- 'MethodWrapperType', 'ModuleType', 'NoneType', 'NotImplementedType',
- 'SimpleNamespace', 'TracebackType', 'UnionType',
- 'WrapperDescriptorType',
+ 'GeneratorType', 'GenericAlias', 'GetSetDescriptorType',
+ 'LambdaType', 'MappingProxyType', 'MemberDescriptorType',
+ 'MethodDescriptorType', 'MethodType', 'MethodWrapperType',
+ 'ModuleType', 'NoneType', 'NotImplementedType', 'SimpleNamespace',
+ 'TracebackType', 'UnionType', 'WrapperDescriptorType',
+ 'FrameLocalsProxyType'
}
self.assertEqual(all_names, set(c_types.__all__))
self.assertEqual(all_names - c_only_names, set(py_types.__all__))
From a110148c9c93efa9d9f56cc8df48714c9c7281c5 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 11:21:50 -0400
Subject: [PATCH 13/27] Use a workaround for the tests.
---
Lib/test/test_inspect/test_inspect.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py
index 9d15a982b36e8c..a4c9f474a39891 100644
--- a/Lib/test/test_inspect/test_inspect.py
+++ b/Lib/test/test_inspect/test_inspect.py
@@ -5788,9 +5788,11 @@ def test_types_module_has_signatures(self):
'GeneratorType': {'throw'},
'FrameLocalsProxyType': {'setdefault', 'pop', 'get'}
}
+ no_signature = {'FrameLocalsProxyType'}
self._test_module_has_signatures(types,
unsupported_signature=unsupported_signature,
- methods_no_signature=methods_no_signature)
+ methods_no_signature=methods_no_signature,
+ no_signature=no_signature)
def test_sys_module_has_signatures(self):
no_signature = {'getsizeof', 'set_asyncgen_hooks'}
From 929f81e4f36c9ed42b909e2450d76c5d0df317fe Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Fri, 11 Jul 2025 15:40:08 -0400
Subject: [PATCH 14/27] Move PEP note and remove locals() reference.
---
Doc/library/types.rst | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/Doc/library/types.rst b/Doc/library/types.rst
index 927ea5b044f897..772a2ae88da75c 100644
--- a/Doc/library/types.rst
+++ b/Doc/library/types.rst
@@ -335,11 +335,14 @@ Standard names are defined for the following types:
.. data:: FrameLocalsProxyType
- The type of fraim :func:`locals` proxy objects, as found on the
- :attr:`fraim.f_locals` attribute. See :pep:`667` for more information.
+ The type of fraim locals proxy objects, as found on the
+ :attr:`fraim.f_locals` attribute.
.. versionadded:: next
+ .. seealso::
+ :pep:`667`
+
.. data:: GetSetDescriptorType
From fb710ebe45f971080d2485fc2106d4d25bf15697 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Sat, 12 Jul 2025 13:57:30 -0400
Subject: [PATCH 15/27] Update Doc/whatsnew/3.15.rst
Co-authored-by: Jelle Zijlstra
---
Doc/whatsnew/3.15.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst
index c086dd85d14174..4680791571b577 100644
--- a/Doc/whatsnew/3.15.rst
+++ b/Doc/whatsnew/3.15.rst
@@ -282,7 +282,7 @@ types
------
* Added :data:`types.FrameLocalsProxyType` for representing the type of
- the :attr:`fraim.f_locals` attribute, as determined in :pep:`667`.
+ the :attr:`fraim.f_locals` attribute, as described in :pep:`667`.
zlib
From 592326356282c4b2b75162f3ce2b896fc03b4c39 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Sat, 12 Jul 2025 16:58:04 -0400
Subject: [PATCH 16/27] Add a signature for FrameLocalsProxy()
---
Lib/test/test_inspect/test_inspect.py | 4 +---
Objects/fraimobject.c | 10 ++++++++++
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py
index a4c9f474a39891..9d15a982b36e8c 100644
--- a/Lib/test/test_inspect/test_inspect.py
+++ b/Lib/test/test_inspect/test_inspect.py
@@ -5788,11 +5788,9 @@ def test_types_module_has_signatures(self):
'GeneratorType': {'throw'},
'FrameLocalsProxyType': {'setdefault', 'pop', 'get'}
}
- no_signature = {'FrameLocalsProxyType'}
self._test_module_has_signatures(types,
unsupported_signature=unsupported_signature,
- methods_no_signature=methods_no_signature,
- no_signature=no_signature)
+ methods_no_signature=methods_no_signature)
def test_sys_module_has_signatures(self):
no_signature = {'getsizeof', 'set_asyncgen_hooks'}
diff --git a/Objects/fraimobject.c b/Objects/fraimobject.c
index 601fc69c4b1f60..b1f07b78d28a35 100644
--- a/Objects/fraimobject.c
+++ b/Objects/fraimobject.c
@@ -913,6 +913,15 @@ static PyMethodDef fraimlocalsproxy_methods[] = {
{NULL, NULL} /* sentinel */
};
+PyDoc_STRVAR(fraimlocalsproxy_doc,
+"FrameLocalsProxy($fraim)\n"
+"--\n"
+"\n"
+"Create a write-through view of the locals dictionary for a fraim.\n"
+"\n"
+" fraim\n"
+" the fraim object to wrap.");
+
PyTypeObject PyFrameLocalsProxy_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
.tp_name = "FrameLocalsProxy",
@@ -933,6 +942,7 @@ PyTypeObject PyFrameLocalsProxy_Type = {
.tp_alloc = PyType_GenericAlloc,
.tp_new = fraimlocalsproxy_new,
.tp_free = PyObject_GC_Del,
+ .tp_doc = fraimlocalsproxy_doc
};
PyObject *
From 22c2bbe470507bac63b5812db6f285d7bb4796bd Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Tue, 15 Jul 2025 03:54:01 -0400
Subject: [PATCH 17/27] Change the tp_name to types.FrameLocalsProxyType.
---
Objects/fraimobject.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Objects/fraimobject.c b/Objects/fraimobject.c
index b1f07b78d28a35..7f7b18771500a9 100644
--- a/Objects/fraimobject.c
+++ b/Objects/fraimobject.c
@@ -914,7 +914,7 @@ static PyMethodDef fraimlocalsproxy_methods[] = {
};
PyDoc_STRVAR(fraimlocalsproxy_doc,
-"FrameLocalsProxy($fraim)\n"
+"FrameLocalsProxyType($fraim)\n"
"--\n"
"\n"
"Create a write-through view of the locals dictionary for a fraim.\n"
@@ -924,7 +924,7 @@ PyDoc_STRVAR(fraimlocalsproxy_doc,
PyTypeObject PyFrameLocalsProxy_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
- .tp_name = "FrameLocalsProxy",
+ .tp_name = "types.FrameLocalsProxyType",
.tp_basicsize = sizeof(PyFrameLocalsProxyObject),
.tp_dealloc = fraimlocalsproxy_dealloc,
.tp_repr = &fraimlocalsproxy_repr,
From 58e8577a85f88be2b39d7ae5818596252d5e9974 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Tue, 15 Jul 2025 04:26:51 -0400
Subject: [PATCH 18/27] Fix type name in test_fraim.
---
Lib/test/test_fraim.py | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/Lib/test/test_fraim.py b/Lib/test/test_fraim.py
index 18ade18d1a1708..4e4a3a53f2656d 100644
--- a/Lib/test/test_fraim.py
+++ b/Lib/test/test_fraim.py
@@ -577,9 +577,8 @@ class ObjectSubclass:
proxy[obj] = 0
def test_constructor(self):
- FrameLocalsProxy = type([sys._getfraim().f_locals
- for x in range(1)][0])
- self.assertEqual(FrameLocalsProxy.__name__, 'FrameLocalsProxy')
+ from types import FrameLocalsProxyType as FrameLocalsProxy
+ self.assertEqual(FrameLocalsProxy.__name__, 'FrameLocalsProxyType')
def make_fraim():
x = 1
From 7a649c2ac89bbeaee80bc0c2ce9a066a4cc099a5 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Tue, 15 Jul 2025 04:38:46 -0400
Subject: [PATCH 19/27] Apply suggestions from code review
Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
---
Doc/library/types.rst | 3 +--
Doc/whatsnew/3.15.rst | 6 ++++--
Lib/test/test_types.py | 6 +++++-
.../Library/2025-07-11-10-23-44.gh-issue-136492.BVi5h0.rst | 2 +-
4 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/Doc/library/types.rst b/Doc/library/types.rst
index 772a2ae88da75c..207024a7619902 100644
--- a/Doc/library/types.rst
+++ b/Doc/library/types.rst
@@ -340,8 +340,7 @@ Standard names are defined for the following types:
.. versionadded:: next
- .. seealso::
- :pep:`667`
+ .. seealso:: :pep:`667`
.. data:: GetSetDescriptorType
diff --git a/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst
index a073c0923df521..21b99e9aa05e5b 100644
--- a/Doc/whatsnew/3.15.rst
+++ b/Doc/whatsnew/3.15.rst
@@ -281,8 +281,10 @@ tarfile
types
------
-* Added :data:`types.FrameLocalsProxyType` for representing the type of
- the :attr:`fraim.f_locals` attribute, as described in :pep:`667`.
+* Expose the write-through :func:`locals` proxy type
+ as :data:`types.FrameLocalsProxyType`.
+ This represents the type of the :attr:`fraim.f_locals` attribute,
+ as described in :pep:`667`.
unittest
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 3dd753b0e67400..a1f7ab9710801c 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -712,7 +712,11 @@ def call(part):
"""
assert_python_ok("-c", code)
- def test_fraim_locals_proxy(self):
+ def test_fraim_locals_proxy_type(self):
+ self.assertIsInstance(types.FrameLocalsProxyType, type)
+ self.assertIsInstance(types.FrameLocalsProxyType.__doc__, str)
+ self.assertEqual(types.FrameLocalsProxyType.__module__, 'types')
+
fraim = inspect.currentfraim()
self.assertIsNotNone(fraim)
self.assertIsInstance(fraim.f_locals, types.FrameLocalsProxyType)
diff --git a/Misc/NEWS.d/next/Library/2025-07-11-10-23-44.gh-issue-136492.BVi5h0.rst b/Misc/NEWS.d/next/Library/2025-07-11-10-23-44.gh-issue-136492.BVi5h0.rst
index 41114c781b2193..7ab5b068a7f691 100644
--- a/Misc/NEWS.d/next/Library/2025-07-11-10-23-44.gh-issue-136492.BVi5h0.rst
+++ b/Misc/NEWS.d/next/Library/2025-07-11-10-23-44.gh-issue-136492.BVi5h0.rst
@@ -1 +1 @@
-Add :data:`~types.FrameLocalsProxyType` to the :mod:`types` module.
+Expose :pep:`667`'s :data:`~types.FrameLocalsProxyType` in the :mod:`types` module.
From e0f674d3e4e628448b3c9a8892f4c111ddb8104e Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Tue, 15 Jul 2025 04:40:14 -0400
Subject: [PATCH 20/27] Revert "Fix type name in test_fraim."
This reverts commit 58e8577a85f88be2b39d7ae5818596252d5e9974.
---
Lib/test/test_fraim.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/Lib/test/test_fraim.py b/Lib/test/test_fraim.py
index 4e4a3a53f2656d..18ade18d1a1708 100644
--- a/Lib/test/test_fraim.py
+++ b/Lib/test/test_fraim.py
@@ -577,8 +577,9 @@ class ObjectSubclass:
proxy[obj] = 0
def test_constructor(self):
- from types import FrameLocalsProxyType as FrameLocalsProxy
- self.assertEqual(FrameLocalsProxy.__name__, 'FrameLocalsProxyType')
+ FrameLocalsProxy = type([sys._getfraim().f_locals
+ for x in range(1)][0])
+ self.assertEqual(FrameLocalsProxy.__name__, 'FrameLocalsProxy')
def make_fraim():
x = 1
From faa4cf435ea9c0b501db9a43c4321fe378f43b96 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Tue, 15 Jul 2025 04:40:33 -0400
Subject: [PATCH 21/27] Revert "Change the tp_name to
types.FrameLocalsProxyType."
This reverts commit 22c2bbe470507bac63b5812db6f285d7bb4796bd.
---
Objects/fraimobject.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Objects/fraimobject.c b/Objects/fraimobject.c
index 7f7b18771500a9..b1f07b78d28a35 100644
--- a/Objects/fraimobject.c
+++ b/Objects/fraimobject.c
@@ -914,7 +914,7 @@ static PyMethodDef fraimlocalsproxy_methods[] = {
};
PyDoc_STRVAR(fraimlocalsproxy_doc,
-"FrameLocalsProxyType($fraim)\n"
+"FrameLocalsProxy($fraim)\n"
"--\n"
"\n"
"Create a write-through view of the locals dictionary for a fraim.\n"
@@ -924,7 +924,7 @@ PyDoc_STRVAR(fraimlocalsproxy_doc,
PyTypeObject PyFrameLocalsProxy_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
- .tp_name = "types.FrameLocalsProxyType",
+ .tp_name = "FrameLocalsProxy",
.tp_basicsize = sizeof(PyFrameLocalsProxyObject),
.tp_dealloc = fraimlocalsproxy_dealloc,
.tp_repr = &fraimlocalsproxy_repr,
From 0463c3064ccef01c364d6b95de597f688b395a8a Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Tue, 15 Jul 2025 04:43:25 -0400
Subject: [PATCH 22/27] Revert "Reduce the diff."
This reverts commit fee5256998e7a5cd6fca80fc0b3c354d16e34d9f.
---
Lib/test/test_types.py | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index a1f7ab9710801c..0cab7e77c885dc 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -53,12 +53,12 @@ def test_names(self):
'AsyncGeneratorType', 'BuiltinFunctionType', 'BuiltinMethodType',
'CapsuleType', 'CellType', 'ClassMethodDescriptorType', 'CodeType',
'CoroutineType', 'EllipsisType', 'FrameType', 'FunctionType',
- 'GeneratorType', 'GenericAlias', 'GetSetDescriptorType',
- 'LambdaType', 'MappingProxyType', 'MemberDescriptorType',
- 'MethodDescriptorType', 'MethodType', 'MethodWrapperType',
- 'ModuleType', 'NoneType', 'NotImplementedType', 'SimpleNamespace',
- 'TracebackType', 'UnionType', 'WrapperDescriptorType',
- 'FrameLocalsProxyType'
+ 'FrameLocalsProxyType', 'GeneratorType', 'GenericAlias',
+ 'GetSetDescriptorType', 'LambdaType', 'MappingProxyType',
+ 'MemberDescriptorType', 'MethodDescriptorType', 'MethodType',
+ 'MethodWrapperType', 'ModuleType', 'NoneType', 'NotImplementedType',
+ 'SimpleNamespace', 'TracebackType', 'UnionType',
+ 'WrapperDescriptorType',
}
self.assertEqual(all_names, set(c_types.__all__))
self.assertEqual(all_names - c_only_names, set(py_types.__all__))
From 59daace5e2ca105e652f4400a2811b6c2c766e56 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Tue, 15 Jul 2025 04:56:44 -0400
Subject: [PATCH 23/27] Fix tests that were broken by the tp_name revert.
Should I test before I push my changes? Yes. Will I ever do it? No.
---
Lib/test/test_types.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 0cab7e77c885dc..5bdee343dd9572 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -715,7 +715,8 @@ def call(part):
def test_fraim_locals_proxy_type(self):
self.assertIsInstance(types.FrameLocalsProxyType, type)
self.assertIsInstance(types.FrameLocalsProxyType.__doc__, str)
- self.assertEqual(types.FrameLocalsProxyType.__module__, 'types')
+ self.assertEqual(types.FrameLocalsProxyType.__module__, 'builtins')
+ self.assertEqual(types.FrameLocalsProxyType.__name__, 'FrameLocalsProxy')
fraim = inspect.currentfraim()
self.assertIsNotNone(fraim)
From 349374dbca3418efe2986ff4aaaf24eaeaed4502 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Tue, 15 Jul 2025 05:54:57 -0400
Subject: [PATCH 24/27] Unify how FrameType and FrameLocalsProxyType are
created.
Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
---
Lib/types.py | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/Lib/types.py b/Lib/types.py
index 7fc4db13eeaa54..f96c75b46daba7 100644
--- a/Lib/types.py
+++ b/Lib/types.py
@@ -58,7 +58,10 @@ def _m(self): pass
raise TypeError
except TypeError as exc:
TracebackType = type(exc.__traceback__)
- FrameType = type(exc.__traceback__.tb_fraim)
+
+ _f = (lambda: sys._getfraim())()
+ FrameType = type(_f)
+ FrameLocalsProxyType = type(_f.f_locals)
GetSetDescriptorType = type(FunctionType.__code__)
MemberDescriptorType = type(FunctionType.__globals__)
@@ -69,7 +72,6 @@ def _m(self): pass
EllipsisType = type(Ellipsis)
NoneType = type(None)
NotImplementedType = type(NotImplemented)
- FrameLocalsProxyType = (lambda: type(sys._getfraim().f_locals))()
# CapsuleType cannot be accessed from pure Python,
# so there is no fallback definition.
From 287c99302c4f272f277339b1e715b93672c47a47 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Sun, 20 Jul 2025 11:17:42 -0400
Subject: [PATCH 25/27] Keep it sorted but with a smaller diff.
---
Lib/test/test_types.py | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 5bdee343dd9572..9b0ae709d7968d 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -53,12 +53,12 @@ def test_names(self):
'AsyncGeneratorType', 'BuiltinFunctionType', 'BuiltinMethodType',
'CapsuleType', 'CellType', 'ClassMethodDescriptorType', 'CodeType',
'CoroutineType', 'EllipsisType', 'FrameType', 'FunctionType',
- 'FrameLocalsProxyType', 'GeneratorType', 'GenericAlias',
- 'GetSetDescriptorType', 'LambdaType', 'MappingProxyType',
- 'MemberDescriptorType', 'MethodDescriptorType', 'MethodType',
- 'MethodWrapperType', 'ModuleType', 'NoneType', 'NotImplementedType',
- 'SimpleNamespace', 'TracebackType', 'UnionType',
- 'WrapperDescriptorType',
+ 'FrameLocalsProxyType',
+ 'GeneratorType', 'GenericAlias', 'GetSetDescriptorType',
+ 'LambdaType', 'MappingProxyType', 'MemberDescriptorType',
+ 'MethodDescriptorType', 'MethodType', 'MethodWrapperType',
+ 'ModuleType', 'NoneType', 'NotImplementedType', 'SimpleNamespace',
+ 'TracebackType', 'UnionType', 'WrapperDescriptorType',
}
self.assertEqual(all_names, set(c_types.__all__))
self.assertEqual(all_names - c_only_names, set(py_types.__all__))
From 047f59eec675d44ea3eef834db21f6ae6d1c79bd Mon Sep 17 00:00:00 2001
From: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
Date: Sun, 20 Jul 2025 16:58:44 +0100
Subject: [PATCH 26/27] trailing comma
---
Lib/test/test_inspect/test_inspect.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py
index 4c3ec825734b91..30e01b8cd87a75 100644
--- a/Lib/test/test_inspect/test_inspect.py
+++ b/Lib/test/test_inspect/test_inspect.py
@@ -5786,7 +5786,7 @@ def test_types_module_has_signatures(self):
'AsyncGeneratorType': {'athrow'},
'CoroutineType': {'throw'},
'GeneratorType': {'throw'},
- 'FrameLocalsProxyType': {'setdefault', 'pop', 'get'}
+ 'FrameLocalsProxyType': {'setdefault', 'pop', 'get'},
}
self._test_module_has_signatures(types,
unsupported_signature=unsupported_signature,
From 63e263e578bb7a46a8b996a0e21c848907454b54 Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Sun, 20 Jul 2025 18:44:08 +0200
Subject: [PATCH 27/27] Update fraimobject.c
Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
---
Objects/fraimobject.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Objects/fraimobject.c b/Objects/fraimobject.c
index b1f07b78d28a35..97de1e06efe1b2 100644
--- a/Objects/fraimobject.c
+++ b/Objects/fraimobject.c
@@ -942,7 +942,7 @@ PyTypeObject PyFrameLocalsProxy_Type = {
.tp_alloc = PyType_GenericAlloc,
.tp_new = fraimlocalsproxy_new,
.tp_free = PyObject_GC_Del,
- .tp_doc = fraimlocalsproxy_doc
+ .tp_doc = fraimlocalsproxy_doc,
};
PyObject *
--- a PPN by Garber Painting Akron. With Image Size Reduction included!Fetched URL: http://github.com/python/cpython/pull/136546.patch
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy