1

我正在做一个简单的对象编组事情,它在一个简单的 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 等,但我无法找到任何关于一个人会怎么做。

4

1 回答 1

5

使用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()or iteritesm()。否则,迭代字典只会产生键。


的示例用法setattr

>>> class Klass:
...     def __init__(self):
...         self.a = 1
...         self.b = 2
...
>>> x = Klass()
>>> setattr(x, 'a', 3)
>>> x.a
3
于 2014-02-16T08:27:55.930 回答