Обновление объекта Python из словаря - PullRequest
16 голосов
/ 02 января 2009

Есть ли встроенная функция / оператор, которую я мог бы использовать, чтобы распаковать значения из словаря и присвоить его переменным экземпляра?

Вот что я собираюсь сделать:

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

Что-то похожее на словарь update(), который загружает значения из другого словаря, но для простого объекта / экземпляра класса?

Ответы [ 4 ]

32 голосов
/ 03 января 2009

есть также другой способ сделать это, просматривая элементы в d. это не то же самое предположение, что они будут храниться в c.__dict__, что не всегда верно.

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

или вы можете написать update метод как часть MyClass, чтобы c.update(d) работал так, как вы ожидали.

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

проверить помощь для setattr

setattr(...)
    setattr(object, name, value)
    Set a named attribute on an object; setattr(x, 'y', v) is equivalent to
    ''x.y = v''.
27 голосов
/ 02 января 2009

Вы пробовали

f.__dict__.update( b )

7 голосов
/ 02 января 2009

Также, возможно, было бы неплохо иметь обертку вокруг метода обновления dict:

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

PS: Извините, что не комментировал сообщение @ S.Lott , но у меня пока нет представителя.

0 голосов
/ 28 марта 2019

Вы можете попробовать сделать:

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)
...