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:这是在别人的代码里看到的,欢迎大家指教。
Lihat nama kelas Fungsi kelas ini adalah untuk memastikan pasangan nilai kunci yang ditulis pada panggilan terakhir adalah di penghujung. pasangan nilai kunci berada di hadapan.
a ialah objek instan, dengan masing-masing 3 pasangan nilai kunci, lihat
1) 3 -> 4
2) 5 -> 6
3) 3 -> 2
Kunci 1) dan 3) adalah sama, tetapi nilainya berbeza Kelas bermaksud siapa yang menulis data kemudian ( [(3, 4), (5, 6)])
Apabila melakukan langkah 3, kerana kamus anda ialah kamus tersusun dan pasangan nilai kunci yang akan disisipkan kemudian adalah di belakang, hasil yang dijangkakan ialah LastUpdatedOrderedDict([(5, 6), (3 , 2)]).
Jika anda tidak memasukkan kunci di sini, hanya tatasusunan asal akan dikemas kini semasa __setitem__, dan hasilnya akan menjadi
LastUpdatedOrderedDict([(3, 2), (5, 6)])
Jadi anda perlu Del padamkan kunci, ganggu struktur sebelumnya, dan kemudian masukkan pasangan nilai kunci.