mirror of
https://github.com/python/cpython.git
synced 2024-11-23 18:04:37 +08:00
bpo-38565: add new cache_parameters method for lru_cache (GH-16916)
This commit is contained in:
parent
98480cef9d
commit
051ff526b5
@ -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
|
||||
|
@ -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
|
||||
|
@ -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):
|
||||
|
@ -0,0 +1 @@
|
||||
Add new cache_parameters() method for functools.lru_cache() to better support pickling.
|
Loading…
Reference in New Issue
Block a user