44 lines
974 B
Python
44 lines
974 B
Python
|
import collections
|
||
|
|
||
|
class Cache:
|
||
|
def __init__(self, maxlen):
|
||
|
self.maxlen = maxlen
|
||
|
self.cache = collections.OrderedDict()
|
||
|
|
||
|
def __contains__(self, key):
|
||
|
return key in self.cache
|
||
|
|
||
|
def __getitem__(self, key):
|
||
|
value = self.cache.pop(key)
|
||
|
self.cache[key] = value
|
||
|
return value
|
||
|
|
||
|
def __len__(self):
|
||
|
return len(self.cache)
|
||
|
|
||
|
def __setitem__(self, key, value):
|
||
|
try:
|
||
|
self.cache.pop(key)
|
||
|
except KeyError:
|
||
|
if len(self.cache) >= self.maxlen:
|
||
|
self.cache.popitem(last=False)
|
||
|
self.cache[key] = value
|
||
|
|
||
|
def clear(self):
|
||
|
self.cache.clear()
|
||
|
|
||
|
def get(self, key, fallback=None):
|
||
|
try:
|
||
|
return self[key]
|
||
|
except KeyError:
|
||
|
return fallback
|
||
|
|
||
|
def pop(self, key):
|
||
|
return self.cache.pop(key)
|
||
|
|
||
|
def remove(self, key):
|
||
|
try:
|
||
|
self.pop(key)
|
||
|
except KeyError:
|
||
|
pass
|