lrucache.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. class LRUCache(dict):
  2. def __init__(self, capacity):
  3. super(LRUCache, self).__init__()
  4. self._lru = []
  5. self._capacity = capacity
  6. def __setitem__(self, key, value):
  7. try:
  8. self._lru.remove(key)
  9. except ValueError:
  10. pass
  11. self._lru.append(key)
  12. while len(self._lru) > self._capacity:
  13. del self[self._lru[0]]
  14. return super(LRUCache, self).__setitem__(key, value)
  15. def __getitem__(self, key):
  16. try:
  17. self._lru.remove(key)
  18. self._lru.append(key)
  19. except ValueError:
  20. pass
  21. return super(LRUCache, self).__getitem__(key)
  22. def __delitem__(self, key):
  23. try:
  24. self._lru.remove(key)
  25. except ValueError:
  26. pass
  27. return super(LRUCache, self).__delitem__(key)
  28. def pop(self, key, default=None):
  29. try:
  30. self._lru.remove(key)
  31. except ValueError:
  32. pass
  33. return super(LRUCache, self).pop(key, default)
  34. def _not_implemented(self, *args, **kw):
  35. raise NotImplementedError
  36. popitem = setdefault = update = _not_implemented