summaryrefslogtreecommitdiffstats
path: root/Doc
diff options
context:
space:
mode:
authorMiss Skeleton (bot) <31488909+miss-islington@users.noreply.github.com>2020-10-25 02:00:14 (GMT)
committerGitHub <noreply@github.com>2020-10-25 02:00:14 (GMT)
commit427cb0aa78813b89a3f100073bf7d70a53510f57 (patch)
tree22021459d85b18990b7f8c1d3ede4fdba3422f2f /Doc
parent2d493893c7aa9af633c4ebeb56ecce42e3a82e9f (diff)
downloadcpython-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')
-rw-r--r--Doc/library/functools.rst33
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.