2012-04-05 1 views
2

Ich möchte eine + = Notation für die Aktualisierung eines dict-like-Objekts in Python verwenden. Ich möchte dasselbe Verhalten wie die Methode dict.update haben. Hier ist meine Klasse (Wörterbuch mit Zugang ""):Überladung + = in Python für einen Mapping-Typ

class sdict(dict): 
    def __getattr__(self, attr): 
     return self.get(attr, None) 
    __setattr__= dict.__setitem__ 
    __delattr__= dict.__delitem__ 

Ich habe versucht:

__iadd__ = dict.update 

Und:

def __iadd__(self, other): 
    self.update(other) 
    return self 

aber keines dieser Arbeit. (das erste zerstört das ursprüngliche Wörterbuch und das zweite erzeugt SyntaxError)

Aktualisierung:
Zweite Definition funktioniert tatsächlich. Es hat nicht funktioniert, weil ich def vergessen habe. Der erste funktioniert nicht, da dict.update None zurückgibt.

Antwort

12

denke ich, alles, was Sie fehlt ein def ist:

class sdict(dict): 
    def __getattr__(self, attr): 
     return self.get(attr, None) 
    __setattr__= dict.__setitem__ 
    __delattr__= dict.__delitem__ 
    def __iadd__(self, other): 
     self.update(other) 
     return self 

>>> a = sdict() 
>>> a.b = 3 
>>> a 
{'b': 3} 
>>> a.b 
3 
>>> a['b'] 
3 
>>> a += {'fred': 3} 
>>> a 
{'b': 3, 'fred': 3} 
+0

Augh, es hat mich geschlagen! Hier, habe meine wertvollen +1 – Blender

+0

Hoppla ... Das war blöd ... Danke für die Antwort! Jede Idee, warum '__iadd__ = dict.update' nicht funktioniert? – user1084871

+1

'dict.update' return Keiner – Dikei