2014-02-16 73 views
1

我正在做一個簡單的對象編組事物,該事物在簡單的RESTful API與peewee管理的數據存儲之間傳遞。然而,這種模式不斷上來(form是的cgi.FieldStorage()輸出):如何按名稱設置Python對象的字段/成員

if form.getfirst('From'): msg.msg_from=form.getfirst('From') 
if form.getfirst('To'): msg.msg_to=form.getfirst('To') 
if form.getfirst('Body'): msg.msg_body=form.getfirst('Body') 

這,當然,這些混沌難以維持。我寧願做的是有這樣的事情:

keyMapping = { 'From': 'msg_from', 
       'To': 'msg_to', 
       'Body': 'msg_body' } 
for k, v in keyMapping: 
    if form.getfirst(k): msg.SET_FIELD_VALUE(v, form.getfirst(k)) 

顯然,這是我無法找到SET_FIELD_VALUE。我知道如何使用eval來做到這一點,但我寧願避免這種情況,顯然,我意識到實際模式實際上可能涉及某種形式的字段引用或反射API或類似代碼,但我無法找到任何內容關於怎麼會這樣做。

回答

4

使用setattr

keyMapping = { 'From': 'msg_from', 
       'To': 'msg_to', 
       'Body': 'msg_body' } 
for k, v in keyMapping.items(): 
    if form.getfirst(k): 
     setattr(msg, v, form.getfirst(k)) 

BTW,你應該使用items()iteritesm()。否則,迭代dictiaonary只產生鍵。的setattr


用法示例:

>>> class Klass: 
...  def __init__(self): 
...   self.a = 1 
...   self.b = 2 
... 
>>> x = Klass() 
>>> setattr(x, 'a', 3) 
>>> x.a 
3 
+0

謝謝,這只是工作。我想我真的需要重新閱讀Python文檔了...... – fluffy

相關問題