<p>将函数包装在<code>lru_cache()</code>中,然后在顶部添加修饰符并通过<code>__wrapped__</code>属性访问原始的未缓存函数,或者更好的方法是使用<a href="https://docs.python.org/3/library/inspect.html#inspect.unwrap" rel="nofollow noreferrer">^{<cd3>} function</a>来剥离任意数量的装饰器的函数:</p>
<pre><code>from functools import wraps
from inspect import unwrap
def bypass_cache_last_time(func):
@wraps(func)
def function_wrapper(*args, **kwargs):
if not 'time' in kwargs or kwargs['time'] == 'last':
# Bypass any additional decorators and call function directly
return unwrap(func)(*args, **kwargs)
else:
return func(*args, **kwargs)
return function_wrapper
</code></pre>
<p>把这个当作</p>
^{pr2}$
<p>当<code>functools.wraps()</code>装饰器设置包装器上的<code>__wrapped__</code>属性时,<code>functools.wraps()</code>再次向前传递展开装饰器的能力。在</p>
<p>或者让您的decorator应用<code>lru_cache()</code>修饰符本身,并在装饰时保留原始函数的副本:</p>
<pre><code>def my_lru_cache(func):
cached = lru_cache()(func)
@wraps(func)
def function_wrapper(*args, **kwargs):
if not 'time' in kwargs or kwargs['time'] == 'last':
# call the function directly
return func(*args, **kwargs)
else:
# use the lru_cache-wrapped version
return cached(*args, **kwargs)
return function_wrapper
</code></pre>
<p>将此用作</p>
<pre><code>@my_lru_cache
def some_function(x, time='last'):
# ...
</code></pre>