diff options
author | Manjusaka <me@manjusaka.me> | 2019-11-12 07:30:18 (GMT) |
---|---|---|
committer | Raymond Hettinger <rhettinger@users.noreply.github.com> | 2019-11-12 07:30:18 (GMT) |
commit | 051ff526b5dc2c40c4a53d87089740358822edfa (patch) | |
tree | 3672f1a8ca53bfb008d3f56d2b8c5f29a04e3f6b | |
parent | 98480cef9dba04794bd61c7e7cca643d384c8c35 (diff) | |
download | cpython-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.rst | 8 | ||||
-rw-r--r-- | Lib/functools.py | 2 | ||||
-rw-r--r-- | Lib/test/test_functools.py | 11 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2019-10-24-08-10-30.bpo-38565.SWSUst.rst | 1 |
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 |