Was ist die richtige Art und Weise zu erweitern, die Dict-Klasse?
Ich soll die Implementierung von zwei verschiedenen Wörterbüchern mit einem vordefinierten Satz von gültigen keys. Auch ein Wörterbuch enthält, die andere.
class Otherdict (dict):
_keys = ['A','B']
def __init__(self):
for key in self._keys:
self[key] = None
def populateDict(self):
self['B'] = 10
self['A'] = 12
class MyDict(dict):
_keys = ['R','ED']
def __init__(self):
for key in self._keys:
self[key] = None
def __getitem__(self, key):
if key not in self._keys:
raise Exception("'" + key + "'" + " is not a valid key")
dict.__getitem__(self,key)
def __setitem__(self, key, value):
if key not in self._keys:
raise Exception("'" + key + "'" + " is not a valid key")
dict.__setitem__(self,key,value)
def populateDict(self):
d = Otherdict()
d.populateDict()
self['R'] = 3
self['ED'] = d
a = MyDict()
a.populateDict()
print a['ED'].__class__ #prints <type 'NoneType'>
Das problem ist, dass ich aus irgendeinem Grund keinen Zugriff auf das Wörterbuch befindet sich unter dem 'ED' - Taste. Was mache ich hier falsch?
Ich habe auch bemerkt, dass, wenn ich entfernen Sie die __getitem__()
Methode, der code funktioniert einwandfrei
- Sie müssen auf die
if key not in self._keys:
überprüfen? Kannst du nicht einfach anrufendict.__getitem__
und lassen die Ausnahme zu propagieren? - Ich würde nur empfehlen, Sie verwenden eine Ausnahme geben, das ist ein bisschen genauer als
Exception
; es wird Ausnahmen abfangen leichter. - Einen kleinen Fehler mit großer Wirkung, leicht zu erkennen. Dennoch kein Grund für -1, IMHO.
- Sie sind beide Recht, ich werde die änderungen vornehmen, danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
__getitem__
muss einen Wert zurückgeben:Wenn es keine explizite return-Anweisung, Python-Funktionen werden standardmäßig Keine.
Verwenden
return
imdef __getitem__(self, key)
:return dict.__getitem__(self,key)
,den code ordnungsgemäß ausgeführt, wenn Sie entfernen
__getitem__
es ist, weil es dann auf__getitem__
von übergeordneten Klassen(diedict
in diesem Fall).