From 8ef875028a3644a329c87ce420a73793e315143f Mon Sep 17 00:00:00 2001 From: Ethan Smith Date: Mon, 13 Apr 2020 21:54:40 -0700 Subject: [PATCH] bpo-39481: Make weakref and WeakSet generic (GH-19497) --- 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 7a84823622e..b267780f0ce 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 @@ class WeakSet: 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 770aeef4510..686df17d6a9 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -33,6 +33,7 @@ from tempfile import TemporaryDirectory, SpooledTemporaryFile 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 @@ -73,6 +74,7 @@ class BaseTest(unittest.TestCase): 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 1e6697b729c..dd9b7898235 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*/