2012-09-24 65 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謝謝,我不知道。 –