]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39481: Make weakref and WeakSet generic (GH-19497)
authorEthan Smith <ethan@ethanhs.me>
Tue, 14 Apr 2020 04:54:40 +0000 (21:54 -0700)
committerGitHub <noreply@github.com>
Tue, 14 Apr 2020 04:54:40 +0000 (21:54 -0700)
Lib/_weakrefset.py
Lib/test/test_genericalias.py
Objects/weakrefobject.c

index 7a84823622ee7c7bec5f97294d3cc9bba94c0137..b267780f0ced73087c8670473fdf4e7fe22ff193 100644 (file)
@@ -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)
index 770aeef45105b5d53197c3018806f18d576355b0..686df17d6a961f1ccf9e89ebd80ff2b2ddba42db 100644 (file)
@@ -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,
index 1e6697b729c9c0856b8b9e5f133417e17f023312..dd9b789823512450b8cf4a0864191bb979b29a22 100644 (file)
@@ -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*/