如何使用cachetools ttl_cache忽略函数参数

flo*_*urr 4 python caching python-3.x

我正在利用cachetools @ttl_cache装饰器(不是@cached)。我需要忽略缓存键中的一些参数。例如,。

@ttl_cache(maxsize=1024, ttl=600)
def my_func(foo, ignore_bar, ignore_baz):
    # do stuff
Run Code Online (Sandbox Code Playgroud)

以这种方式工作,我得到了这个:

>>> my_func("foo", "ignore_bar", "ignore_baz")         # cache miss
>>> my_func("foo", "ignore_bar", "ignore_baz")         # cache hit
>>> my_func("foo", "ignore_bar_bar", "ignore_baz_baz") # cache miss!
Run Code Online (Sandbox Code Playgroud)

我需要的:

>>> my_func("foo", "ignore_bar", "ignore_baz")         # cache miss
>>> my_func("foo", "ignore_bar", "ignore_baz")         # cache hit
>>> my_func("foo", "ignore_bar_bar", "ignore_baz_baz") # cache hit!!!!!
Run Code Online (Sandbox Code Playgroud)

有没有办法使用它@ttl_cache

Tho*_*mer 5

好吧,这正是@cached它的自定义key参数的用途,所以我想知道为什么你想用@ttl_cache它:

from cachetools import TTLCache, cached
from cachetools.keys import hashkey

def mykey(foo, ignore_bar, ignore_baz):
    return hashkey(foo)

@cached(cache=TTLCache(maxsize=1024, ttl=600), key=mykey)
def my_func(foo, ignore_bar, ignore_baz):
    # do stuff
Run Code Online (Sandbox Code Playgroud)

  • 我懂了。已经有一个将这些添加到“@cached”的功能请求,这可能是可行的方法:https://github.com/tkem/cachetools/issues/131 但是,直到这得到实现(我担心)不会太快发生),恐怕没有“官方”方法可以做到这一点。 (2认同)
  • 正确的。#131 已计划在 v5.0.0 中发布,但由于缺乏资源而被推迟。但是,将来的版本肯定会考虑它,但不要询问发布日期;-) (2认同)