我正在做一个简单的对象编组工作,在一个简单的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等,但我也找不到任何关于如何做到这一点的信息。
发布于 2014-02-16 08:27:55
使用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()。否则,迭代只产生键。
setattr的示例用法
>>> class Klass:
... def __init__(self):
... self.a = 1
... self.b = 2
...
>>> x = Klass()
>>> setattr(x, 'a', 3)
>>> x.a
3https://stackoverflow.com/questions/21808905
复制相似问题