64 lines
1.6 KiB
Python
64 lines
1.6 KiB
Python
# the caching decorator for helpers functions
|
|
class VersionedCache(object):
|
|
__slots__ = ( 'cache', 'masterCache', 'nextSlot', 'size')
|
|
|
|
def __init__(self):
|
|
self.cache = []
|
|
self.masterCache = {}
|
|
self.nextSlot = 0
|
|
self.size = 0
|
|
|
|
def reset(self):
|
|
# reinit the whole cache
|
|
self.masterCache = {}
|
|
self.update(0)
|
|
|
|
def update(self, newKey):
|
|
cache = self.masterCache.get(newKey, None)
|
|
if cache is None:
|
|
cache = [ None ] * self.size
|
|
self.masterCache[newKey] = cache
|
|
self.cache = cache
|
|
|
|
def decorator(self, func):
|
|
return self._decorate(func.__name__, self._new_slot(), func)
|
|
|
|
# for lambdas
|
|
def ldeco(self, func):
|
|
return self._decorate(func.__code__, self._new_slot(), func)
|
|
|
|
def _new_slot(self):
|
|
slot = self.nextSlot
|
|
self.nextSlot += 1
|
|
self.size += 1
|
|
return slot
|
|
|
|
def _decorate(self, name, slot, func):
|
|
def _decorator(arg):
|
|
#ret = self.cache[slot]
|
|
#if ret is not None:
|
|
# return ret
|
|
#else:
|
|
ret = func(arg)
|
|
# self.cache[slot] = ret
|
|
return ret
|
|
return _decorator
|
|
|
|
Cache = VersionedCache()
|
|
|
|
class RequestCache(object):
|
|
def __init__(self):
|
|
self.results = {}
|
|
|
|
def request(self, request, *args):
|
|
return ''.join([request] + [str(arg) for arg in args])
|
|
|
|
def store(self, request, result):
|
|
self.results[request] = result
|
|
|
|
def get(self, request):
|
|
return self.results[request] if request in self.results else None
|
|
|
|
def reset(self):
|
|
self.results.clear()
|