Question

Is there a built-in function/operator I could use to unpack values from a dictionary and assign it into instance variables?

This is what I intend to do:

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

Something akin to dictionary update() which load values from another dictionary but for plain object/class instance?

Was it helpful?

Solution

there is also another way of doing it by looping through the items in d. this doesn't have the same assuption that they will get stored in c.__dict__ which isn't always true.

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

or you could write a update method as part of MyClass so that c.update(d) works like you expected it to.

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

check out the help for setattr

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

OTHER TIPS

Have you tried

f.__dict__.update( b )

?

Also, maybe it would be good style to have a wrapper around the dict's update method:

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

PS: Sorry for not commenting at @S.Lott 's post but I don't have the rep yet.

You can try doing:

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)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top