如何在使用functools.cache时通知用户获取的是缓存结果?
实现缓存命中提示的几种方法
针对你用functools.cache装饰函数的场景,有几种简单的方式可以在返回缓存结果时告知用户:
方法一:自定义带提示的缓存装饰器
这种方式对调用者完全透明,不需要修改原有函数的调用逻辑,只需要替换装饰器即可:
import functools def cached_with_hint(func): # 先用标准缓存装饰器包装原函数 cached_func = functools.cache(func) @functools.wraps(func) def wrapper(*args, **kwargs): # 调用前记录缓存命中次数 before_hits = cached_func.cache_info().hits result = cached_func(*args, **kwargs) # 调用后对比命中次数,判断是否命中缓存 if cached_func.cache_info().hits > before_hits: print("注意:当前返回的是缓存版本的结果") return result return wrapper # 使用自定义装饰器替代原有的functools.cache @cached_with_hint def get_some_results(): print("正在生成原始结果...") return "示例结果" # 测试调用 get_some_results() # 输出:正在生成原始结果... get_some_results() # 输出:注意:当前返回的是缓存版本的结果
方法二:调用时手动检查缓存状态
如果你不想修改装饰器,可以在调用函数时通过cache_info()方法判断是否命中缓存:
import functools @functools.cache def get_some_results(): print("正在生成原始结果...") return "示例结果" # 第一次调用(生成原始结果) get_some_results() # 后续调用时检查缓存 before_hits = get_some_results.cache_info().hits result = get_some_results() if get_some_results.cache_info().hits > before_hits: print("当前返回的是缓存版本的结果")
方法三:修改函数返回值(不推荐,会改变接口)
如果可以接受修改函数的返回格式,可以让函数同时返回结果和是否为缓存的标记:
_cache = {} def get_some_results(): if "result" in _cache: print("注意:当前返回的是缓存版本的结果") return _cache["result"], True # 生成原始结果的逻辑 result = "示例结果" _cache["result"] = result return result, False # 调用示例 res, is_cached = get_some_results() # 返回原始结果,is_cached=False res, is_cached = get_some_results() # 打印提示,is_cached=True
注意事项
functools.cache是Python 3.9及以上版本才支持的特性,等价于functools.lru_cache(maxsize=None);- 方法一中的缓存命中判断逻辑适用于大多数场景,对于带参数的函数同样有效,因为
cache_info().hits会统计所有参数组合的命中次数; - 如果需要更精细的控制(比如针对特定参数组合提示),不建议直接访问缓存内部存储,因为这依赖CPython的内部实现,可能会在版本更新中变化。
内容的提问来源于stack exchange,提问作者bloo
相关产品推荐
相关产品推荐

