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?

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top