diff options
author | Miss Skeleton (bot) <31488909+miss-islington@users.noreply.github.com> | 2020-10-25 02:00:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-25 02:00:14 (GMT) |
commit | 427cb0aa78813b89a3f100073bf7d70a53510f57 (patch) | |
tree | 22021459d85b18990b7f8c1d3ede4fdba3422f2f /Doc/library | |
parent | 2d493893c7aa9af633c4ebeb56ecce42e3a82e9f (diff) | |
download | cpython-427cb0aa78813b89a3f100073bf7d70a53510f57.zip cpython-427cb0aa78813b89a3f100073bf7d70a53510f57.tar.gz cpython-427cb0aa78813b89a3f100073bf7d70a53510f57.tar.bz2 |
bpo-42127: Document effect of cached_property on key-sharing dictionaries (GH-22930) (GH-22955)
Diffstat (limited to 'Doc/library')
-rw-r--r-- | Doc/library/functools.rst | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 14aa184..4869b67 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -73,16 +73,31 @@ The :mod:`functools` module defines the following functions: def variance(self): return statistics.variance(self._data) - .. versionadded:: 3.8 + Note, this decorator interferes with the operation of :pep:`412` + key-sharing dictionaries. This means that instance dictionaries + can take more space than usual. - .. note:: + Also, this decorator requires that the ``__dict__`` attribute on each instance + be a mutable mapping. This means it will not work with some types, such as + metaclasses (since the ``__dict__`` attributes on type instances are + read-only proxies for the class namespace), and those that specify + ``__slots__`` without including ``__dict__`` as one of the defined slots + (as such classes don't provide a ``__dict__`` attribute at all). + + If a mutable mapping is not available or if space-efficient key sharing + is desired, an effect similar to :func:`cached_property` can be achieved + by a stacking :func:`property` on top of :func:`cache`:: - This decorator requires that the ``__dict__`` attribute on each instance - be a mutable mapping. This means it will not work with some types, such as - metaclasses (since the ``__dict__`` attributes on type instances are - read-only proxies for the class namespace), and those that specify - ``__slots__`` without including ``__dict__`` as one of the defined slots - (as such classes don't provide a ``__dict__`` attribute at all). + class DataSet: + def __init__(self, sequence_of_numbers): + self._data = sequence_of_numbers + + @property + @cache + def stdev(self): + return statistics.stdev(self._data) + + .. versionadded:: 3.8 .. function:: cmp_to_key(func) @@ -651,4 +666,4 @@ callable, weak referencable, and can have attributes. There are some important differences. For instance, the :attr:`~definition.__name__` and :attr:`__doc__` attributes are not created automatically. Also, :class:`partial` objects defined in classes behave like static methods and do not transform into bound methods -during instance attribute look-up.
\ No newline at end of file +during instance attribute look-up. |