summaryrefslogtreecommitdiff
path: root/sqlplain/memoize.py
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