From cecf049673da6a24435acd1a6a3b34472b323c97 Mon Sep 17 00:00:00 2001 From: Ethan Smith Date: Mon, 13 Apr 2020 21:53:04 -0700 Subject: [PATCH] bpo-39481: Make functools.cached_property, partial, partialmethod generic (#19427) --- Lib/functools.py | 6 ++++++ Lib/test/test_genericalias.py | 2 ++ Modules/_functoolsmodule.c | 2 ++ 3 files changed, 10 insertions(+) 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 @@ from collections import namedtuple # import types, weakref # Deferred to single_dispatch() from reprlib import recursive_repr from _thread import RLock +from types import GenericAlias ################################################################################ @@ -656,6 +657,9 @@ class partialmethod(object): def __isabstractmethod__(self): return getattr(self.func, "__isabstractmethod__", False) + __class_getitem__ = classmethod(GenericAlias) + + # Helper functions def _unwrap_partial(func): @@ -1208,3 +1212,5 @@ class cached_property: ) 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 collections.abc import * 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 @@ class BaseTest(unittest.TestCase): 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 */ };