capped_dict.py 843 B

12345678910111213141516171819202122232425262728
  1. from __future__ import annotations
  2. import collections
  3. from typing import Any
  4. class CappedDict(collections.OrderedDict):
  5. default_max_size = 50
  6. def __init__(self, max_size: int | None = None) -> None:
  7. self.max_size = max_size or self.default_max_size
  8. super().__init__()
  9. def __setitem__(self, key: str, val: Any) -> None:
  10. if key not in self:
  11. max_size = self.max_size - 1
  12. self._prune_dict(max_size)
  13. super().__setitem__(key, val)
  14. def update(self, **kwargs: Any) -> None: # type: ignore[override]
  15. super().update(**kwargs)
  16. self._prune_dict(self.max_size)
  17. def _prune_dict(self, max_size: int) -> None:
  18. if len(self) >= max_size:
  19. diff = len(self) - max_size
  20. for k in list(self.keys())[:diff]:
  21. del self[k]