我正在做一个简单的对象编组操作,介于简单的RESTful API和peewee管理的数据存储之间。但是,此模式不断出现(form
是cgi.FieldStorage()
的输出):
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等,但我是无法找到关于如何做到这一点的任何事情。
答案 0 :(得分: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))
顺便说一句,您应该使用items()
或iteritesm()
。否则,迭代dictiaonary仅产生密钥。
setattr
的使用示例:
>>> class Klass:
... def __init__(self):
... self.a = 1
... self.b = 2
...
>>> x = Klass()
>>> setattr(x, 'a', 3)
>>> x.a
3