cachegrab is a Python package that provides decorators for caching instance methods.
pip install cachegrabdeep_cached_property➔ Inspired by functools.cached_property, this decorator provides a deep copy of cached return values, ensuring they remain immutable after their initial access. The original return values are preserved in a dictionary namedself._deep_cache.cached_attribute➔ this decorator returns an internal attribute with the same name as the original, prefixed with an underscore.
from cachegrab import deep_cached_property, cached_attribute
from functools import cached_propertyConsider the example class Dog below:
toys➔ decorated withcached_propertybecause toys can be buried and are therefore mutable.is_good_boy➔ decorated withdeep_cached_propertybecause his good boy status is never in question.tricks➔ decorated withcached_attributeto prevent direct overwrites.
class Dog(object):
@cached_property
def toys(self):
return {'ball','bone'}
@deep_cached_property
def is_good_boy(self):
return True
@cached_attribute
def tricks(self):
return {'sit','shake'}
def bury_toys(self):
while self.toys:
self.toys.pop()We will attempt to modify both cached properties:
dog = Dog()
dog.bury_toys()
dog.good_boy = FalseLet's look at the results:
print('dog toys ➜', ', '.join(dog.toys) if dog.toys else '?')
print('good boy? ➜', dog.is_good_boy)
print('_deep_cache ➜', dog._deep_cache)
dog.tricks # access tricks property
print('_tricks ➜', dog._tricks)dog toys ➜ ?
good boy? ➜ True
_deep_cache ➜ {'is_good_boy': True}
_tricks ➜ {'sit','shake'}