django-orchestra/orchestra/utils/functional.py

17 lines
600 B
Python

def cached(func):
""" caches func return value """
def cached_func(self, *args, **kwargs):
# id(self) prevents sharing within subclasses
attr = '_cached_%s_%i' % (func.__name__, id(self))
key = (args, tuple(kwargs.items()))
try:
return getattr(self, attr)[key]
except KeyError:
value = func(self, *args, **kwargs)
getattr(self, attr)[key] = value
except AttributeError:
value = func(self, *args, **kwargs)
setattr(self, attr, {key: value})
return value
return cached_func