Source code for means.util.memoisation
from functools import wraps
[docs]def memoised_property(function):
@wraps(function)
def wrapper(self):
if not isinstance(self, MemoisableObject):
raise TypeError('Can only memoise properties of MemoisableObject instances')
try:
return self._memoised_properties[function]
except AttributeError:
self._memoised_properties = {function: function(self)}
return self._memoised_properties[function]
except KeyError:
self._memoised_properties[function] = function(self)
return self._memoised_properties[function]
return property(wrapper)
[docs]class MemoisableObject(object):
"""
A wrapper around objects that support ``memoised_property`` decorator.
It overrides the __getstate__ method to prevent pickling cached values.
"""
def __getstate__(self):
state = self.__dict__.copy()
# Remove the cached stuff as this will prevent pickling
try:
del state['_memoised_properties']
except KeyError:
pass
return state