from collections import OrderedDict
import unittest
class LastUpdatedOrderedDict(OrderedDict):
def __init__(self, capacity):
super(LastUpdatedOrderedDict, self).__init__()
self._capacity = capacity
def __setitem__(self, key, value):
containsKey = 1 if key in self else 0
# print(self)
if len(self) - containsKey >= self._capacity:
last = self.popitem(last=False)
print('remove:', last)
if containsKey:
del self[key]
print('set:', (key, value))
else:
print('add:', (key, value))
OrderedDict.__setitem__(self, key, value)
问题:
del self[key] 有什么特殊用意么,如果key存在的话,直接让它执行OrderedDict.__setitem__()就行了吧,没必要del再重新self[key] = value吧
ps:这是在别人的代码里看到的,欢迎大家指教。
看類別的命名,這個類別的作用應該是保證最後一次呼叫時寫入的鍵值對是位於最後的,如果你不del的話,你只是update,列印的時候,鍵值對是在前面的。
a是一個實例化的對象,分別插入了3個鍵值對,見
1) 3 -> 4
2) 5 -> 6
3) 3 - > 2
其中1)和3)的key是相同的,但是value不同,類的意思是誰後寫入的數據,排列時候,誰在後面,在完成步驟2)的時候,對像是LastUpdatedOrderedDict([(3, 4), (5, 6)])
在進行步驟3的時候,因為你這個是個有序的字典,並且要後插入的鍵值對位於後面,期望獲得的結果是LastUpdatedOrderedDict([(5, 6), (3, 2)])。
如果你這裡不del key,在__setitem__的時候,只會更新原來的數組,結果為
LastUpdatedOrderedDict([(3, 2), (5, 6)])#🎜🎜 #所以需要del下key,打亂之前的結構,再進行鍵值對的插入。