From 8352e322e87ba39c71e578b65ad8ae156ca3e0c7 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 14 Jun 2022 07:18:03 +0300 Subject: [PATCH] gh-79512: Fixed names and __module__ value of weakref classes (GH-93719) Classes ReferenceType, ProxyType and CallableProxyType have now correct atrtributes __module__, __name__ and __qualname__. It makes them (types, not instances) pickleable. --- Lib/test/test_weakref.py | 11 +++++++++++ .../2022-06-11-13-32-17.gh-issue-79512.A1KTDr.rst | 3 +++ Objects/weakrefobject.c | 6 +++--- 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2022-06-11-13-32-17.gh-issue-79512.A1KTDr.rst diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py index 702bb4495e7499..3a9573d6e70559 100644 --- a/Lib/test/test_weakref.py +++ b/Lib/test/test_weakref.py @@ -2154,6 +2154,17 @@ def test_atexit(self): self.assertTrue(b'ZeroDivisionError' in err) +class ModuleTestCase(unittest.TestCase): + def test_names(self): + for name in ('ReferenceType', 'ProxyType', 'CallableProxyType', + 'WeakMethod', 'WeakSet', 'WeakKeyDictionary', 'WeakValueDictionary'): + obj = getattr(weakref, name) + if name != 'WeakSet': + self.assertEqual(obj.__module__, 'weakref') + self.assertEqual(obj.__name__, name) + self.assertEqual(obj.__qualname__, name) + + libreftest = """ Doctest for examples in the library reference: weakref.rst >>> from test.support import gc_collect diff --git a/Misc/NEWS.d/next/Library/2022-06-11-13-32-17.gh-issue-79512.A1KTDr.rst b/Misc/NEWS.d/next/Library/2022-06-11-13-32-17.gh-issue-79512.A1KTDr.rst new file mode 100644 index 00000000000000..5393fb52e93c30 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-06-11-13-32-17.gh-issue-79512.A1KTDr.rst @@ -0,0 +1,3 @@ +Fixed names and ``__module__`` value of :mod:`weakref` classes +:class:`~weakref.ReferenceType`, :class:`~weakref.ProxyType`, +:class:`~weakref.CallableProxyType`. It makes them pickleable. diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index 1712533a39d802..2b4361e63ca413 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -371,7 +371,7 @@ static PyMethodDef weakref_methods[] = { PyTypeObject _PyWeakref_RefType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - .tp_name = "weakref", + .tp_name = "weakref.ReferenceType", .tp_basicsize = sizeof(PyWeakReference), .tp_dealloc = weakref_dealloc, .tp_vectorcall_offset = offsetof(PyWeakReference, vectorcall), @@ -719,7 +719,7 @@ static PyMappingMethods proxy_as_mapping = { PyTypeObject _PyWeakref_ProxyType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "weakproxy", + "weakref.ProxyType", sizeof(PyWeakReference), 0, /* methods */ @@ -754,7 +754,7 @@ _PyWeakref_ProxyType = { PyTypeObject _PyWeakref_CallableProxyType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) - "weakcallableproxy", + "weakref.CallableProxyType", sizeof(PyWeakReference), 0, /* methods */