gpt4 book ai didi

python - 使@lru_cache忽略一些函数参数

转载 作者:行者123 更新时间:2023-12-03 02:13:41 24 4
gpt4 key购买 nike

我怎样才能制作@functools.lru_cache装饰器忽略一些与缓存键有关的函数参数?

例如,我有一个如下所示的函数:

def find_object(db_handle, query):
# (omitted code)
return result

如果我像这样应用lru_cache装饰器,db_handle将包含在缓存键中。因此,如果我尝试使用相同的查询但不同的db_handle调用该函数,它将再次执行,这是我想避免的。我希望 lru_cache 仅考虑 query 参数。

最佳答案

cachetools你可以写:

from cachetools import cached
from cachetools.keys import hashkey

from random import randint

@cached(cache={}, key=lambda db_handle, query: hashkey(query))
def find_object(db_handle, query):
print("processing {0}".format(query))
return query

queries = list(range(5))
queries.extend(range(5))
for q in queries:
print("result: {0}".format(find_object(randint(0, 1000), q)))

您需要安装cachetools (pip install cachetools)。

语法是:

@cached(
cache={},
key=lambda <all-function-args>: hashkey(<relevant-args>)
)

这是包含关键字参数的另一个示例:

@cached(
cache={},
key=lambda a, b, c=1, d=2: hashkey(a, c)
)
def my_func(a, b, c=1, d=2):
return a + c

在上面的示例中,请注意 lambda 函数输入参数与 my_func 参数匹配。如果不需要,则不必完全匹配 argspec。例如,您可以使用 kwargs 来消除 hashkey 中不需要的内容:

@cached(
cache={},
key=lambda a, b, c=1, **kwargs: hashkey(a, c)
)
def my_func(a, b, c=1, d=2, e=3, f=4):
return a + c

在上面的示例中,我们在查找缓存值时不关心 d=e=f= 参数,所以我们可以用 **kwargs 将它们全部压扁。

关于python - 使@lru_cache忽略一些函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30730983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com