Create SizedDict

This commit is contained in:
Jules 2024-06-16 14:34:12 +02:00
parent 800f87cf38
commit 8bbddacfe9
Signed by: jdejaegh
GPG key ID: 99D6D184CA66933A
2 changed files with 52 additions and 0 deletions

View file

@ -0,0 +1,22 @@
from collections import OrderedDict
class SizedDict(OrderedDict):
"""Dictionary with a maximum size. When more items are added, the least recently accessed element is evicted"""
def __init__(self, size: int):
super().__init__()
self._size = size
def __setitem__(self, key, value):
super().__setitem__(key, value)
self.move_to_end(key)
if len(self) > self._size:
self.popitem(False)
def __getitem__(self, key):
super().__getitem__(key)
self.move_to_end(key)
def update(self, __m, **kwargs):
raise NotImplementedError()

30
tests/test_sized_dict.py Normal file
View file

@ -0,0 +1,30 @@
from src.open_irceline.utils import SizedDict
def test_size_dict():
s_dict = SizedDict(5)
assert len(s_dict) == 0
s_dict['a'] = 1
s_dict['b'] = 2
s_dict['c'] = 3
s_dict['d'] = 4
s_dict['e'] = 5
assert len(s_dict) == 5
s_dict['f'] = 6
assert 'a' not in s_dict
assert 'f' in s_dict
assert len(s_dict) == 5
s_dict['b'] = 42
s_dict['g'] = 7
assert 'f' in s_dict
assert 'g' in s_dict
assert 'b' in s_dict
assert 'c' not in s_dict
assert len(s_dict) == 5
del s_dict['b']
assert len(s_dict) == 4
assert 'b' not in s_dict