import functools
def cached(f):
_cache = {}
@functools.wraps(f)
def wrapper(self, *args, **kwargs):
key = '-|-'.join(map(unicode, args))\
+'-|-'.join('%s-:-%s' % x for x in kwargs.iteritems())
if key in _cache:
return _cache[key]
ret = f(*args, **kwargs)
_cache[key] = ret
return ret
return wrapper
class foo:
@cached
def bar(self):
print "run!"
return 1
if __name__ == "__main__":
a, b = foo(), foo()
print [a.bar() for i in range(3)]
print [a.bar() for i in range(3)]