2012-09-24 33 views
3

我经常需要做这样的事情:指定值对象

"Some dictionary with values obtained somehow (e.g. submitted form values)" 
my_dict = { 
    'name': 'John', 
    'surname': 'Doe', 
    'age': 27, 
    'hair_color': 'green', 
} 

"object person is some instance of class representing person" 
person.name = my_dict['name'] 
person.surname = my_dict['surname'] 
person.age = my_dict['age'] 
person.hair_color = my_dict['hair_color'] 

我觉得这是一个很大的重复。你使用什么方法?

回答

8
for attr, val in my_dict.items(): 
    setattr(person, attr, val) 

如果my_dict可能包含您不想复制到person,创建键列表你想复制这样做的任何键:

key_list = ['name', 'surname', 'age', 'hair_color'] 
for attr in key_list: 
    setattr(person, attr, my_dict[attr]) 
+0

注意:确保你过滤/ santizie my_dict(限制键),否则用户可以更新任意属性。 –

+0

限制您可以使用明确白名单的密钥,例如'key_list',即使'my_dict'没有未使用的密钥。 – jfs

1

作为一个实例的属性可以通过字典来访问,所以使用instance.__dict__

>>> for item in my_dict: 
     person.__dict__[item]=my_dict[item] 
+2

这将绕开setter属性和'__setattr__'。 – ecatmur

+0

@ecatmur谢谢,我不知道。 –