1# -*- coding: utf-8 -*- 2import collections 3import threading 4 5from .func import synchronized 6 7__all__ = ['LRU'] 8 9class LRU(object): 10 """ 11 Implementation of a length-limited O(1) LRU map. 12 13 Original Copyright 2003 Josiah Carlson, later rebuilt on OrderedDict. 14 """ 15 def __init__(self, count, pairs=()): 16 self._lock = threading.RLock() 17 self.count = max(count, 1) 18 self.d = collections.OrderedDict() 19 for key, value in pairs: 20 self[key] = value 21 22 @synchronized() 23 def __contains__(self, obj): 24 return obj in self.d 25 26 def get(self, obj, val=None): 27 try: 28 return self[obj] 29 except KeyError: 30 return val 31 32 @synchronized() 33 def __getitem__(self, obj): 34 a = self.d[obj] 35 self.d.move_to_end(obj, last=False) 36 return a 37 38 @synchronized() 39 def __setitem__(self, obj, val): 40 self.d[obj] = val 41 self.d.move_to_end(obj, last=False) 42 while len(self.d) > self.count: 43 self.d.popitem(last=True) 44 45 @synchronized() 46 def __delitem__(self, obj): 47 del self.d[obj] 48 49 @synchronized() 50 def __len__(self): 51 return len(self.d) 52 53 @synchronized() 54 def pop(self,key): 55 return self.d.pop(key) 56 57 @synchronized() 58 def clear(self): 59 self.d.clear() 60