Frage

Gibt es eine eingebaute Funktion / Operator-I-Wert entpacken aus einem Wörterbuch und ordnen sie in Instanzvariablen verwenden könnte?

Dies ist, was ich beabsichtige zu tun:

c = MyClass()
c.foo = 123
c.bar = 123

# c.foo == 123 and c.bar == 123


d = {'bar': 456}
c.update(d)

# c.foo == 123 and c.bar == 456

So etwas wie Wörterbuch update() welche Belastungswerte aus einem anderen Wörterbuch aber für Normal Objekt / Klasseninstanz?

War es hilfreich?

Lösung

Es gibt auch eine andere Art und Weise tun, indem durch die Elemente in d Looping. diese haben nicht die gleiche Assuption, dass sie in c.__dict__ gespeichert werden bekommen, was nicht immer der Fall ist.

d = {'bar': 456}
for key,value in d.items():
    setattr(c,key,value)

oder Sie können ein update Verfahren als Teil MyClass schreiben, so dass c.update(d) funktioniert wie man es erwartet.

def update(self,newdata):
    for key,value in newdata.items():
        setattr(self,key,value)

überprüfen Sie die Hilfe für setattr out

setattr(...)
    setattr(object, name, value)
    Set a named attribute on an object; setattr(x, 'y', v) is equivalent to
    ''x.y = v''.

Andere Tipps

Haben Sie versucht,

f.__dict__.update( b )

Auch, vielleicht wäre es gut Stil sein, einen Wrapper zu haben um die Methode Update der dict:

def update(self, b):
    self.__dict__.update(b)

PS: Sorry für die nicht kommentieren auf @ S.Lott ‚s Post, aber ich habe nicht die rep noch.

Sie können versuchen, zu tun:

def to_object(my_object, my_dict):
    for key, value in my_dict.items():
        attr = getattr(my_object, key)
        if hasattr(attr, '__dict__'):
            to_object(attr, value)
        else:
            setattr(my_object, key, value)

obj = MyObject()
data = {'a': 1, 'b': 2}
to_object(obj, data)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top