diff options
author | Ethan Smith <ethan@ethanhs.me> | 2020-04-14 04:53:04 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-14 04:53:04 (GMT) |
commit | cecf049673da6a24435acd1a6a3b34472b323c97 (patch) | |
tree | 10ade472188b307c3a8874124a2ce5696a1da4c8 | |
parent | 584a3cfda4d7a65ea0c1ea1ee541378bb7be46ca (diff) | |
download | cpython-cecf049673da6a24435acd1a6a3b34472b323c97.zip cpython-cecf049673da6a24435acd1a6a3b34472b323c97.tar.gz cpython-cecf049673da6a24435acd1a6a3b34472b323c97.tar.bz2 |
bpo-39481: Make functools.cached_property, partial, partialmethod generic (#19427)
-rw-r--r-- | Lib/functools.py | 6 | ||||
-rw-r--r-- | Lib/test/test_genericalias.py | 2 | ||||
-rw-r--r-- | Modules/_functoolsmodule.c | 2 |
3 files changed, 10 insertions, 0 deletions
diff --git a/Lib/functools.py b/Lib/functools.py index 70fcec5..f05b106 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 02b7283..770aeef 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 f3d8658..2f1b47a 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 */ }; |