Objet de mise à jour Python du dictionnaire
-
03-07-2019 - |
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?
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)