summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManjusaka <me@manjusaka.me>2019-11-12 07:30:18 (GMT)
committerRaymond Hettinger <rhettinger@users.noreply.github.com>2019-11-12 07:30:18 (GMT)
commit051ff526b5dc2c40c4a53d87089740358822edfa (patch)
tree3672f1a8ca53bfb008d3f56d2b8c5f29a04e3f6b
parent98480cef9dba04794bd61c7e7cca643d384c8c35 (diff)
downloadcpython-051ff526b5dc2c40c4a53d87089740358822edfa.zip
cpython-051ff526b5dc2c40c4a53d87089740358822edfa.tar.gz
cpython-051ff526b5dc2c40c4a53d87089740358822edfa.tar.bz2
bpo-38565: add new cache_parameters method for lru_cache (GH-16916)
-rw-r--r--Doc/library/functools.rst8
-rw-r--r--Lib/functools.py2
-rw-r--r--Lib/test/test_functools.py11
-rw-r--r--Misc/NEWS.d/next/Library/2019-10-24-08-10-30.bpo-38565.SWSUst.rst1
4 files changed, 22 insertions, 0 deletions
diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst
index d3debac..cedc3ad 100644
--- a/Doc/library/functools.rst
+++ b/Doc/library/functools.rst
@@ -108,6 +108,11 @@ The :mod:`functools` module defines the following functions:
cached separately. For example, ``f(3)`` and ``f(3.0)`` will be treated
as distinct calls with distinct results.
+ The wrapped function is instrumented with a :func:`cache_parameters`
+ function that returns a new :class:`dict` showing the values for *maxsize*
+ and *typed*. This is for information purposes only. Mutating the values
+ has no effect.
+
To help measure the effectiveness of the cache and tune the *maxsize*
parameter, the wrapped function is instrumented with a :func:`cache_info`
function that returns a :term:`named tuple` showing *hits*, *misses*,
@@ -178,6 +183,9 @@ The :mod:`functools` module defines the following functions:
.. versionchanged:: 3.8
Added the *user_function* option.
+ .. versionadded:: 3.9
+ Added the function :func:`cache_parameters`
+
.. decorator:: total_ordering
Given a class defining one or more rich comparison ordering methods, this
diff --git a/Lib/functools.py b/Lib/functools.py
index 3192bd0..2c01b2e 100644
--- a/Lib/functools.py
+++ b/Lib/functools.py
@@ -499,6 +499,7 @@ def lru_cache(maxsize=128, typed=False):
# The user_function was passed in directly via the maxsize argument
user_function, maxsize = maxsize, 128
wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo)
+ wrapper.cache_parameters = lambda : {'maxsize': maxsize, 'typed': typed}
return update_wrapper(wrapper, user_function)
elif maxsize is not None:
raise TypeError(
@@ -506,6 +507,7 @@ def lru_cache(maxsize=128, typed=False):
def decorating_function(user_function):
wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo)
+ wrapper.cache_parameters = lambda : {'maxsize': maxsize, 'typed': typed}
return update_wrapper(wrapper, user_function)
return decorating_function
diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py
index c300270..a97ca39 100644
--- a/Lib/test/test_functools.py
+++ b/Lib/test/test_functools.py
@@ -1655,6 +1655,17 @@ class TestLRU:
f_copy = copy.deepcopy(f)
self.assertIs(f_copy, f)
+ def test_lru_cache_parameters(self):
+ @self.module.lru_cache(maxsize=2)
+ def f():
+ return 1
+ self.assertEqual(f.cache_parameters(), {'maxsize': 2, "typed": False})
+
+ @self.module.lru_cache(maxsize=1000, typed=True)
+ def f():
+ return 1
+ self.assertEqual(f.cache_parameters(), {'maxsize': 1000, "typed": True})
+
@py_functools.lru_cache()
def py_cached_func(x, y):
diff --git a/Misc/NEWS.d/next/Library/2019-10-24-08-10-30.bpo-38565.SWSUst.rst b/Misc/NEWS.d/next/Library/2019-10-24-08-10-30.bpo-38565.SWSUst.rst
new file mode 100644
index 0000000..34d7afc
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-10-24-08-10-30.bpo-38565.SWSUst.rst
@@ -0,0 +1 @@
+Add new cache_parameters() method for functools.lru_cache() to better support pickling. \ No newline at end of file