diff --git a/Lib/functools.py b/Lib/functools.py index 70fcec5a8f6..f05b106b62c 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -20,6 +20,7 @@ # import types, weakref # Deferred to single_dispatch() from reprlib import recursive_repr from _thread import RLock +from types import GenericAlias ################################################################################ @@ -656,6 +657,9 @@ def __get__(self, obj, cls=None): def __isabstractmethod__(self): return getattr(self.func, "__isabstractmethod__", False) + __class_getitem__ = classmethod(GenericAlias) + + # Helper functions def _unwrap_partial(func): @@ -1208,3 +1212,5 @@ def __get__(self, instance, owner=None): ) raise TypeError(msg) from None return val + + __class_getitem__ = classmethod(GenericAlias) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 02b72838277..770aeef4510 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -9,6 +9,7 @@ from concurrent.futures import Future from concurrent.futures.thread import _WorkItem from contextlib import AbstractContextManager, AbstractAsyncContextManager +from functools import partial, partialmethod, _lru_cache_wrapper, cached_property from ctypes import Array, LibraryLoader from difflib import SequenceMatcher from filecmp import dircmp @@ -49,6 +50,7 @@ def test_subscriptable(self): FileInput, OrderedDict, Counter, UserDict, UserList, Pattern, Match, + partial, partialmethod, cached_property, AbstractContextManager, AbstractAsyncContextManager, Awaitable, Coroutine, AsyncIterable, AsyncIterator, diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index f3d8658044b..2f1b47a5b06 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -414,6 +414,8 @@ partial_setstate(partialobject *pto, PyObject *state) static PyMethodDef partial_methods[] = { {"__reduce__", (PyCFunction)partial_reduce, METH_NOARGS}, {"__setstate__", (PyCFunction)partial_setstate, METH_O}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ };