From c77a3528baf1a7d1740006d7a0832355c9a13dbf Mon Sep 17 00:00:00 2001 From: Ethan Smith Date: Sun, 12 Apr 2020 23:58:02 -0700 Subject: [PATCH 1/2] Make weakref and WeakSet generic --- Lib/_weakrefset.py | 3 +++ Lib/test/test_genericalias.py | 2 ++ Objects/weakrefobject.c | 8 +++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Lib/_weakrefset.py b/Lib/_weakrefset.py index 7a84823622ee7c..b267780f0ced73 100644 --- a/Lib/_weakrefset.py +++ b/Lib/_weakrefset.py @@ -3,6 +3,7 @@ # by abc.py to load everything else at startup. from _weakref import ref +from types import GenericAlias __all__ = ['WeakSet'] @@ -197,3 +198,5 @@ def isdisjoint(self, other): def __repr__(self): return repr(self.data) + + __class_getitem__ = classmethod(GenericAlias) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index a00899f5267d72..b7069e9e4c48d7 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -28,6 +28,7 @@ from urllib.parse import SplitResult, ParseResult from unittest.case import _AssertRaisesContext from queue import Queue, SimpleQueue +from weakref import WeakSet, ReferenceType, ref import typing from typing import TypeVar @@ -67,6 +68,7 @@ def test_subscriptable(self): Array, LibraryLoader, SplitResult, ParseResult, ValueProxy, ApplyResult, + WeakSet, ReferenceType, ref, ShareableList, SimpleQueue, Future, _WorkItem, Morsel, diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index 1e6697b729c9c0..b236b240b16f06 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -362,6 +362,12 @@ static PyMemberDef weakref_members[] = { {NULL} /* Sentinel */ }; +static PyMethodDef weakref_methods[] = { + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, + {NULL} /* Sentinel */ +}; + PyTypeObject _PyWeakref_RefType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) @@ -392,7 +398,7 @@ _PyWeakref_RefType = { 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ - 0, /*tp_methods*/ + weakref_methods, /*tp_methods*/ weakref_members, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ From 5bc1e800e2ecd16d385656babaf15786ccd5ce29 Mon Sep 17 00:00:00 2001 From: Ethan Smith Date: Sun, 12 Apr 2020 23:59:49 -0700 Subject: [PATCH 2/2] Fix spacing' --- Objects/weakrefobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index b236b240b16f06..dd9b7898235124 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -398,7 +398,7 @@ _PyWeakref_RefType = { 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ - weakref_methods, /*tp_methods*/ + weakref_methods, /*tp_methods*/ weakref_members, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/