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:这是在别人的代码里看到的,欢迎大家指教。
Regardez le nom de la classe. La fonction de cette classe devrait être de garantir que la paire clé-valeur écrite dans le dernier appel est à la fin. la paire clé-valeur est au début de.
a est un objet instancié, avec 3 paires clé-valeur insérées respectivement, voir
1) 3 -> 4
2) 5 -> 2
Les clés de 1) et 3) sont les mêmes, mais les valeurs sont différentes. La classe signifie qui écrit les données plus tard, qui est derrière l'étape 2), l'objet est LastUpdatedOrderedDict. ( [(3, 4), (5, 6)])
Lors de l'exécution de l'étape 3, étant donné que votre dictionnaire est un dictionnaire ordonné et que la paire clé-valeur à insérer ultérieurement se trouve à l'arrière, le résultat attendu est LastUpdatedOrderedDict([(5, 6), (3 , 2)]).
Si vous ne supprimez pas la clé ici, seul le tableau d'origine sera mis à jour pendant __setitem__, et le résultat sera
LastUpdatedOrderedDict([(3, 2), (5, 6)])
Donc vous devez supprimer la clé par Del, perturber la structure précédente, puis insérer la paire clé-valeur.