I have this simple cache decorator demo here
@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
I want to access the actual cache dictionary object inside this cached_fib, but when I try to access through cached_fib.cache, it gives me an error saying that AttributeError: 'functools._lru_cache_wrapper' object has no attribute 'cache' though the cache attribute is used in python and c version alike.
Thank you!
>Solution :
The internals of the cache are encapsulated for thread safety and to allow the underlying implementation details to change.
The three public attributes are, some statistics in cache_info:
>>> cached_fib.cache_info()
CacheInfo(hits=0, misses=0, maxsize=None, currsize=0)
>>> cached_fib(123)
22698374052006863956975682
>>> cached_fib.cache_info()
CacheInfo(hits=120, misses=123, maxsize=None, currsize=123)
Details about the init mode in cache_parameters
>>> cached_fib.cache_parameters()
{'maxsize': None, 'typed': False}
And cache_clear which purges the cache.
>>> cached_fib.cache_info()
CacheInfo(hits=120, misses=123, maxsize=None, currsize=123)
>>> cached_fib.cache_clear()
>>> cached_fib.cache_info()
CacheInfo(hits=0, misses=0, maxsize=None, currsize=0)
Additionally, the "uncached" function version is publicly available via __wrapped__, but this is not something specific to functools.cache:
>>> cached_fib
<functools._lru_cache_wrapper object at 0x10b7a3270>
>>> cached_fib.__wrapped__
<function cached_fib at 0x10bb781f0>
If you want a cache implementation where the underlying dict is exposed to the user, I recommend the third-party cachetools library.