Objeto de actualización de Python del diccionario
-
03-07-2019 - |
Pregunta
¿Existe una función / operador incorporado que pueda usar para descomprimir valores de un diccionario y asignarlos a variables de instancia?
Esto es lo que pretendo hacer:
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
¿Algo parecido al diccionario update ()
que carga valores de otro diccionario pero para una instancia de clase / objeto simple?
Solución
también hay otra forma de hacerlo recorriendo los elementos en d. esto no tiene la misma suposición de que se almacenarán en c .__ dict__
que no siempre es cierto.
d = {'bar': 456}
for key,value in d.items():
setattr(c,key,value)
o podría escribir un método update
como parte de MyClass
para que c.update (d)
funcione como esperaba.
def update(self,newdata):
for key,value in newdata.items():
setattr(self,key,value)
mira la ayuda para setattr
setattr(...) setattr(object, name, value) Set a named attribute on an object; setattr(x, 'y', v) is equivalent to ''x.y = v''.
Otros consejos
¿Has probado
f.__dict__.update( b )
?
Además, tal vez sería un buen estilo tener una envoltura alrededor del método de actualización del dict:
def update(self, b):
self.__dict__.update(b)
PD: Perdón por no comentar en @ publicación de S.Lott pero no tengo el representante todavía.
Puedes intentar hacer:
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)