我正在利用cachetools @ttl_cache裝飾器(不是@cached)。我需要忽略快取鍵中的一些引數。例如,。
@ttl_cache(maxsize=1024, ttl=600)
def my_func(foo, ignore_bar, ignore_baz):
# do stuff
那樣作業,我明白了:
>>> 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!
我需要的:
>>> 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!!!!!
有沒有辦法讓它使用@ttl_cache?
uj5u.com熱心網友回復:
我沒有使用過快取工具,但我出于興趣查看了檔案。顯然,沒有內置的方法。如果你真的需要這個功能,我可以建議一個像下面這樣的黑客:
class PackedArgs(tuple):
def __hash__(self):
return hash(self[0])
def __eq__(self, other):
if isinstance(other, self.__class__):
return self[0] == other[0]
else:
return NotImplemented
def pack_args(func):
def inner(packed_args):
return func(*packed_args)
return inner
def unpack_args(func):
def inner(*args):
return func(PackedArgs(args))
return inner
@unpack_args
@ttl_cache(maxsize=1024, ttl=600)
@pack_args
def my_func(foo, ignore_bar, ignore_baz):
# do stuff
本質上:將函式的引數“打包”到一個類似元組的物件中,該物件作為第 0 個元素進行哈希處理,并導致@ttl_cache其行為符合您的需要。然后,“解包”它們以恢復正常的界面,并避免在呼叫時實際上必須傳遞這一大引數。
請注意,這只是一個(非常hacky)的概念,我根本沒有測驗過這段代碼。它可能不會按原樣作業。
順便說一句,你的要求聽起來很有趣。您可以將其作為功能請求提交給 cachetools 并鏈接此執行緒。我可以想象它被實作為類似key=kwarg lambda 的東西,類似于 builtin sort。
uj5u.com熱心網友回復:
嗯,這正是@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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399332.html
下一篇:如何設定欄位值過期時間?
