在 Python 中仅从 lru_cache 中弹出一项

问题描述

我正在使用 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)

函数体为两个调用运行。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...