【问题标题】:Pop only one item from lru_cache in Python在 Python 中仅从 lru_cache 中弹出一项
【发布时间】:2021-04-03 00:41:59
【问题描述】:
我正在使用来自functools 的lru_cache 装饰器,我需要使其中只有一个 项无效,其余的保持不变。 documentation 声明 __wrapped__ 属性用于使用不同的缓存重新包装函数。我也检查了source,但我不知道如何使用它。它说
用户只能通过其公共 API 访问 lru_cache:
cache_info、cache_clear 和 f.__wrapped__
lru_cache 的内部被封装以保证线程安全和
允许实施改变
是否可以从lru_cache 中删除一项(安全地),还是我应该编写自己的缓存功能?
【问题讨论】:
标签:
python
caching
functools
【解决方案1】:
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)
函数体为两个调用运行。