import functools
@functools.cache
def get_some_results():
return results
有没有一种方法可以通知函数的用户,在他们调用函数的任何其他时间,他们得到的结果都是原始结果的缓存版本?
这不是一个完美的方法,但您可以使用自定义装饰器而不是@functools.cache
,后者将用functools.cache
包装您的函数,并在调用前后收集缓存统计信息,以确定查找是否导致缓存命中。
这是匆忙拼凑起来的,但似乎奏效了:
def cache_notify(func):
func = functools.cache(func)
def notify_wrapper(*args, **kwargs):
stats = func.cache_info()
hits = stats.hits
results = func(*args, **kwargs)
stats = func.cache_info()
if stats.hits > hits:
print(f"NOTE: {func.__name__}() results were cached")
return results
return notify_wrapper
作为一个简单函数的例子:
@cache_notify
def f(x):
return -x
print("calling f")
print(f"f(1) returned {f(1)}")
print("calling f again")
print(f"f(1) returned {f(1)}")
结果:
calling f
f(1) returned -1
calling f again
NOTE: f() results were cached
f(1) returned -1
如何";通知用户";可以根据需要进行定制。
还要注意,在多线程环境中,缓存统计数据可能会有点误导;请参阅Python lru_cache:如何才能currsize<未命中<最大尺寸?详细信息。