问题描述
我正在使用 lru_cache
中的 functools
装饰器,并且我需要只使其中的一项无效,其余保持不变。 documentation 声明 __wrapped__
属性用于使用不同的缓存重新包装函数。我也检查了 source,但我不知道如何使用它。它说
用户只能通过其公共 API 访问 lru_cache: cache_info、cache_clear 和 f.__wrapped__ lru_cache 的内部被封装以保证线程安全和 允许实现更改
是否可以(安全地)从 lru_cache
中删除一项,还是应该编写自己的缓存功能?
解决方法
Python 3.9 中的
lru_cache
甚至没有在 Python 中公开任何内容,而是公开 API - 其中包括一个 cache_clear
调用,该调用将使整个缓存无效,而不仅仅是一个键。
因此,与其为此寻找解决方法,不如编写自己的缓存,让您拥有完全控制权。
__wrapped__
属性本身只是原始函数,根本没有 lru_cache 功能。实际上,您可以使用它来完全绕过一次调用的缓存-并且该函数将仅将重复参数作为普通 Python 函数运行-但它的响应根本不会被缓存.
也就是说,对于
from functools import lru_cache
@lru_cache
def test(a):
print("side effect")
test(23)
test.__wrapped__(23)
函数体为两个调用运行。