Question

Existe-t-il une fonction / un opérateur intégré que je pourrais utiliser pour décompresser les valeurs d’un dictionnaire et les affecter à des variables d’instance?

C’est ce que je compte faire:

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

Quelque chose s'apparente au dictionnaire update () qui charge les valeurs d'un autre dictionnaire mais pour une instance d'objet / classe simple?

Était-ce utile?

La solution

il existe également un autre moyen de le faire en parcourant les éléments de d. cela n'a pas la même supposition qu'ils seront stockés dans c .__ dict __ , ce qui n'est pas toujours vrai.

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

ou vous pourriez écrire une méthode update dans le cadre de MyClass afin que c.update (d) fonctionne comme vous le souhaitiez.

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

consultez l'aide de setattr

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

Autres conseils

Avez-vous essayé

f.__dict__.update( b )

?

En outre, il serait peut-être bon d'avoir un wrapper autour de la méthode de mise à jour du dict:

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

PS: Désolé de ne pas commenter au @ post de S.Lott mais je n'ai pas le rep encore.

Vous pouvez essayer de faire:

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top