Python aggiorna l'oggetto dal dizionario
-
03-07-2019 - |
Domanda
Esiste una funzione / operatore incorporato che potrei usare per decomprimere i valori da un dizionario e assegnarlo a variabili di istanza?
Questo è quello che intendo fare:
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
Qualcosa di simile al dizionario update ()
che carica valori da un altro dizionario ma per istanza di oggetto / classe semplice?
Soluzione
c'è anche un altro modo di farlo scorrendo ciclicamente gli elementi in d. questo non ha la stessa supposizione che verranno archiviati in c .__ dict__
che non è sempre vero.
d = {'bar': 456}
for key,value in d.items():
setattr(c,key,value)
oppure potresti scrivere un metodo update
come parte di MyClass
in modo che c.update (d)
funzioni come ti aspettavi.
def update(self,newdata):
for key,value in newdata.items():
setattr(self,key,value)
controlla l'aiuto per setattr
setattr(...) setattr(object, name, value) Set a named attribute on an object; setattr(x, 'y', v) is equivalent to ''x.y = v''.
Altri suggerimenti
Hai provato
f.__dict__.update( b )
Inoltre, forse sarebbe bello avere un wrapper attorno al metodo di aggiornamento del dict:
def update(self, b):
self.__dict__.update(b)
PS: mi dispiace per non aver commentato il post di @ S.Lott ma non ho il rappresentante ancora.
Puoi provare a fare:
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)