You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:40:34