OrderedDict упорядочен по последнему использованному элементу.Python

Программы на Python
Ответить
Anonymous
 OrderedDict упорядочен по последнему использованному элементу.

Сообщение Anonymous »

Я написал небольшой класс кэша. Он основан на стандартном словаре и сохраняется на диске. Поскольку размер кэша рабочей системы теперь превысил системную память, я хотел бы реализовать механизм выдачи результатов. Для этого я хотел бы вести подсчет и выбрасывать наименее важные элементы. Один из способов сделать это — использовать OrderedDict и переместить все недавно использованные элементы в конец, а затем я смогу выбросить элементы спереди, когда размер кэша превысит размер.
Чтобы добиться этого, мне сначала нужен словарь, который будет хранить недавно использованные элементы на одном конце и наименее недавно использованные элементы на другом. В документации Python есть несколько полезных примеров. Я создал класс ниже. Он немедленно завершается сбоем при выполнении самой простой операции — popitem().
class LastUpdatedOrderedDict(OrderedDict):
def __setitem__(self, key, value):
super().__setitem__(key, value)
self.move_to_end(key)

def popitem(self, last = True):
return super().popitem(last=last)

def __getitem__(self, key):
value = super().__getitem__(key)
self.move_to_end(key)
return value

Если использовать приведенный выше класс для выполнения следующего кода, выдается исключение:
d = LastUpdatedOrderedDict({1: 'a', 2: 'b', 3: 'c'})
x = d.popitem() # Throws exception

В частности, если метод __getitem__() прерывается по адресу self.move_to_end(key), то можно наблюдать следующее поведение:
key in self
Out[4]: True
key in self.keys()
Out[5]: True
self.keys()
Out[6]: odict_keys([1, 2])
key in set(self.keys())
Out[7]: False

Как лучше всего решить эту проблему? Четко,popitem() вызывает dict.__getitem__(), но, когда дело доходит до ключей, он, похоже, находится в каком-то промежуточном состоянии.
EDIT: исключение, которое я получаю, приведено ниже:
result = testfunction(**testargs)
File "/infra/test/test_caching.py", line 105, in test_LastUpdatedOrderedDict
x = d.popitem()
File "/home/infra/infra/caching.py", line 22, in popitem
return super().popitem(last=last)
File "/infra/infra/caching.py", line 26, in __getitem__
self.move_to_end(key)
KeyError: 3


Подробнее здесь: https://stackoverflow.com/questions/798 ... ed-element
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»