如何获取functools._lru_cache_wrapper对象的缓存字典?
解决functools.cache装饰器缓存字典访问问题
functools.cache本质是functools.lru_cache(maxsize=None)的别名,它返回的functools._lru_cache_wrapper对象并没有公开的cache属性,这就是你访问cached_fib.cache时触发AttributeError的原因。
获取实际缓存字典的方法
要访问内部的缓存字典,可以直接访问装饰后函数的私有属性_cache(注意属性名前有单个下划线):
import functools import time @functools.cache def cached_fib(n): assert n > 0 if n <= 2: return 1 return cached_fib(n - 1) + cached_fib(n - 2) t1 = time.perf_counter() cached_fib(400) t2 = time.perf_counter() print(f"cached_fib: {t2 - t1}") # 0.0004117000003134308 # 访问并打印缓存字典信息 cache_dict = cached_fib._cache print(f"缓存条目数量: {len(cache_dict)}") # 示例:打印前5个缓存的键值对 print("前5个缓存条目:") for key, value in list(cache_dict.items())[:5]: print(f" {key}: {value}")
注意事项
_cache属于Python内部实现细节,并非公开API,不同Python版本可能会修改这个属性的名称或结构,长期维护的代码应避免直接依赖它。- 如果仅需查看缓存的统计数据(命中次数、未命中次数等),建议使用公共方法
cached_fib.cache_info(),它返回一个包含缓存统计信息的命名元组,兼容性更好:print(cached_fib.cache_info()) # 输出示例:CacheInfo(hits=398, misses=400, maxsize=None, currsize=400)
内容的提问来源于stack exchange,提问作者Fed_Dragon
相关产品推荐
相关产品推荐

