blob: 45e0f186d29671ac287279627309f6a39fba2b3a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
from decorator import decorator
class Memoize(object):
registry = []
@classmethod
def clear(cls, cachetype=object):
for func in cls.registry:
if issubclass(func.cachetype, cachetype):
func.cache.clear()
def __init__(self, cachetype):
self.cachetype = cachetype
def call(self, func, *args, **kw):
if kw:
key = args, frozenset(kw.iteritems())
else:
key = args
try:
return func.cache[key]
except KeyError:
res = func.cache[key] = func(*args, **kw)
return res
def __call__(self, func):
func.cache = {}
new = decorator(self.call, func)
new.cachetype = self.cachetype
self.registry.append(new)
return new
memoize = Memoize(object)
if __name__ == '__main__': # test
@memoize
def f():
return 1
|