17 lines
600 B
Python
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
|