【问题标题】:Pop only one item from lru_cache in Python在 Python 中仅从 lru_cache 中弹出一项
【发布时间】:2021-04-03 00:41:59
【问题描述】:

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

    函数体为两个调用运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多