Python 可选的函数缓存

26 浏览
0 Comments

Python 可选的函数缓存

在Python中,缓存一个具有可选缓存参数的函数的最佳方法是什么?

我有一个函数,执行数据库请求并不需要任何参数。大多数情况下,如果函数使用缓存结果,那么它是没问题的,但有时我想发送一个新的数据库请求。

from functools import lru_cache
@lru_cache
def my_database_request_function(use_cache: bool = False):
    if use_cache:
    # takes response from cache
    else:
    # makes database request
    return response

上述实现无法正常工作,因为第二次调用函数时,使用use_cache=False参数,它不会发出新的请求。

admin 更改状态以发布 2023年5月24日
0
0 Comments

from multipledispatch import dispatch
from functools import lru_cache
@dispatch(bool)
@lru_cache
def my_database_request_function(use_cache: bool):
    print('cached')
@dispatch()
def my_database_request_function():
    print('NOT cached')
my_database_request_function(True)
my_database_request_function(False)
my_database_request_function()

输出:

cached
cached
NOT cached

使用一个叫做multipledispatch的模块,你可以进行函数重载,即在有多个同名函数的情况下,你可以为每个函数指定不同的参数。这里的bool可以更改为任何你喜欢的东西。

0
0 Comments

使用 lru_cache 的 cache_clear() 清除缓存值并强制重新获取:

[...] 这个装饰器还提供了一个 cache_clear() 函数来清除或无效化缓存。[...]

示例:

from functools import lru_cache
what = 1     # global value for demo purposes
@lru_cache
def my_database_request_function():
    return what
print(my_database_request_function())
what = 42                                  # change value
print(my_database_request_function())      # gets cached value
my_database_request_function.cache_clear() # clear cache
print(my_database_request_function())      # not cached

输出:

1
1  # after changing the global 'what' variable, still gets cached result
42 # after .cache_clear()

0