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?

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top