functools.cache-通知结果已缓存


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<未命中<最大尺寸?详细信息。

相关内容

  • 没有找到相关文章

最新更新