Ich dachte mit ich überschreibe einfach die __setitem__ Methode und setzte da einen Wert um... Aber so einfach ist das nicht:
Code: Alles auswählen
fake_db = {
1 : {"jo": "Daten für Modul 1"},
2 : {
"jup": "Daten für Modul 2",
"data": {},
},
}
class PluginConfig(dict):
_cache = {}
def __init__(self, module_id):
self.module_id = module_id
self.modified = False
def init2(self):
if self.module_id in self._cache:
# Daten sind schon im cache
print "Aus dem cache"
dict.__init__(self, self._cache[self.module_id])
return
# Daten sind noch nicht im cache -> aus db holen
print "aus der DB"
data = fake_db[self.module_id]
# In cache eintragen
self._cache[self.module_id] = data
dict.__init__(self, data)
def __setitem__(self, key, value):
print "setitem!"
self.modified = True
dict.__setitem__(self, key, value)
def commit(self):
print "commit!"
print "self.modified:", self.modified
print dict.__str__(self)
print self._cache[self.module_id]
p = PluginConfig(1)
p.init2()
print p
print "-"*79
p = PluginConfig(1)
p.init2()
print p
p["jo"] = "neu" # Hier geht es, natürlich
p.commit()
print "-"*79
p = PluginConfig(2)
p.init2()
print p
p["data"]["neu"] = 1 # Hier nicht
p.commit()
Wie könnte ich das Lösen?
EDIT: Eine Lösung die mir einfällt: Ich mache eine deepcopy und vergleichen dann...