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:这是在别人的代码里看到的,欢迎大家指教。
怪我咯2017-04-17 17:36:30
클래스 이름을 보세요. 이 클래스의 기능은 마지막 호출에서 작성된 키-값 쌍이 끝에 있는지 확인하는 것입니다. 삭제하지 않으면 인쇄할 때 업데이트하면 됩니다. 키-값 쌍이 앞에 있습니다.
으아악a는 각각 3개의 키-값 쌍이 삽입된 인스턴스화된 객체입니다.
1) 3 -> 4
2) 5 -> 6
3) 2<을 참조하세요. 🎜>1)과 3)의 키는 같지만 값이 다릅니다. 클래스는 나중에 데이터를 쓰는 사람이 누구인지, 2) 단계를 완료하면 개체가 LastUpdatedOrderedDict( [ (3, 4), (5, 6)])
3단계를 수행할 때 이것은 순서가 지정된 사전이고 나중에 삽입할 키-값 쌍이 마지막에 있기 때문에 예상되는 결과는 LastUpdatedOrderedDict([( 5, 6), (3, 2)]).
여기서 키를 삭제하지 않으면 __setitem__ 중에 원래 배열만 업데이트되고 결과는
LastUpdatedOrderedDict([(3, 2), (5, 6)])
이 됩니다. Del 키를 삭제하고 이전 구조를 중단한 다음 키-값 쌍을 삽입해야 합니다.