如何按名称设置Python对象的字段/成员

时间:2014-02-16 08:25:58

标签: python reflection peewee

我正在做一个简单的对象编组操作,介于简单的RESTful API和peewee管理的数据存储之间。但是,此模式不断出现(formcgi.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等,但我是无法找到关于如何做到这一点的任何事情。

1 个答案:

答案 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