flu*_*ffy 1 python reflection peewee
我正在做一个简单的对象编组事情,它在一个简单的 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')
Run Code Online (Sandbox Code Playgroud)
当然,这很笨拙且难以维护。我更愿意做的是这样的事情:
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))
Run Code Online (Sandbox Code Playgroud)
显然这是我找不到的 SET_FIELD_VALUE 。我知道如何使用它,eval但显然我宁愿避免这种情况,而且我意识到实际模式实际上可能涉及某种形式的字段引用或反射 API 等,但我无法找到任何关于人们将如何做到这一点。
使用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))
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您应该使用items()或iteritesm()。否则,迭代字典只会产生键。
示例用法setattr:
>>> class Klass:
... def __init__(self):
... self.a = 1
... self.b = 2
...
>>> x = Klass()
>>> setattr(x, 'a', 3)
>>> x.a
3
Run Code Online (Sandbox Code Playgroud)