From: Ethan Smith Date: Tue, 14 Apr 2020 04:54:40 +0000 (-0700) Subject: bpo-39481: Make weakref and WeakSet generic (GH-19497) X-Git-Tag: v3.9.0a6~129 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8ef875028a3644a329c87ce420a73793e315143f;p=thirdparty%2FPython%2Fcpython.git bpo-39481: Make weakref and WeakSet generic (GH-19497) --- diff --git a/Lib/_weakrefset.py b/Lib/_weakrefset.py index 7a84823622ee..b267780f0ced 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 770aeef45105..686df17d6a96 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 1e6697b729c9..dd9b78982351 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*/