expired_dict.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import time
  2. from datetime import datetime, timedelta
  3. class ExpiredDict(dict):
  4. def __init__(self, expires_in_seconds):
  5. super().__init__()
  6. self.expires_in_seconds = expires_in_seconds
  7. def __getitem__(self, key):
  8. value, expiry_time = super().__getitem__(key)
  9. # 如果元素已过期,则从字典中删除该元素并抛出 KeyError 异常
  10. if time.monotonic() > expiry_time:
  11. del self[key]
  12. raise KeyError("expired {}".format(key))
  13. self.__setitem__(key, value)
  14. return value
  15. def __setitem__(self, key, value):
  16. expiry_time = datetime.now() + timedelta(seconds=self.expires_in_seconds)
  17. super().__setitem__(key, (value, expiry_time))
  18. def get(self, key, default=None):
  19. try:
  20. return self[key]
  21. except KeyError:
  22. return default
  23. def __contains__(self, key):
  24. try:
  25. self[key]
  26. return True
  27. except KeyError:
  28. return False
  29. def keys(self):
  30. keys=list(super().keys())
  31. return [key for key in keys if key in self]
  32. def items(self):
  33. return [(key, self[key]) for key in self.keys()]
  34. def __iter__(self):
  35. return self.keys().__iter__()