functools.cache() for methods, done correctly
Project description
methodic_cache
functools.cache()
for methods, done correctly.
Features
- Simple to use
- Extendable with custom cache backends (e.g. LRUCache, LFUCache, etc.)
- Works with non-hashable objects
- Works with frozen/slotted classes
- Tested for memory leaks
Installation
pip install methodic_cache
Usage
from methodic_cache import cached_method
class MyClass:
@cached_method
def my_method(self, arg1, arg2):
return arg1 + arg2
my_obj = MyClass()
my_obj.my_method(1, 2) # returns 3
my_obj.my_method(1, 2) # returns 3 from the cache
Using classes with __slots__
Classes that define __slots__
need to have a __weakref__
slot to be able to be weakly referenced:
from methodic_cache import cached_method
class MyClass:
__slots__ = ("my_attr", "__weakref__") # <-- __weakref__ is required
def __init__(self, my_attr):
self.my_attr = my_attr
@cached_method
def my_method(self, arg1, arg2):
print(f"Computing {self.my_attr} + {arg1} + {arg2}...")
return self.my_attr + arg1 + arg2
my_obj = MyClass(1)
my_obj.my_method(2, 3)
# prints "Computing 1 + 2 + 3..."
# returns 6
my_obj.my_method(2, 3)
# returns 6
Custom cache backends
You can use any cache backend that implements the MutableMapping
interface (e.g. dict
, lru_cache
, functools.lru_cache
, etc.).
The default cache backend is cachetools.Cache(maxsize=math.inf)
, which will keep the cache bounded to the lifetime of the self
object.
You can use a different cache backend by passing it as the cache_factory
argument to cached_method
:
from methodic_cache import cached_method
from cachetools import LRUCache
class MyClass:
@cached_method(cache_factory=lambda: LRUCache(maxsize=1))
def my_method(self, arg1, arg2):
print(f"Computing {arg1} + {arg2}...")
return arg1 + arg2
my_obj = MyClass()
my_obj.my_method(1, 1)
# prints Computing 1 + 1...
# returns 2
my_obj.my_method(1, 1)
# returns 2
my_obj.my_method(2, 2)
# prints Computing 2 + 2...
# returns 4
my_obj.my_method(1, 1) # <-- this will be recomputed because the cache is full
# prints Computing 1 + 1...
# returns 2
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
methodic_cache-0.3.0.tar.gz
(5.2 kB
view hashes)
Built Distribution
Close
Hashes for methodic_cache-0.3.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 258bdc83b8434e69a6522aa7deca485480fdef88eba2a666f7ea508f4df2b559 |
|
MD5 | a0d91443001747a6a8a5681d292602c7 |
|
BLAKE2b-256 | 57b5743adeb0d569d4eb5ae0b4a926977010618bf37a44df6ad8fa195491ab3c |