首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按名称设置Python对象的字段/成员

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

Stack Overflow用户
提问于 2014-02-16 08:25:57
回答 1查看 1.5K关注 0票数 1

我正在做一个简单的对象编组工作,在一个简单的RESTful API到一个peewee管理的数据存储之间。但是,这种模式不断出现(formcgi.FieldStorage()的输出):

代码语言:javascript
复制
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')

当然,这是残酷和难以维持的。我宁愿做这样的事情:

代码语言:javascript
复制
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等,但我也找不到任何关于如何做到这一点的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-16 08:27:55

使用setattr

代码语言:javascript
复制
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的示例用法

代码语言:javascript
复制
>>> class Klass:
...     def __init__(self):
...         self.a = 1
...         self.b = 2
...
>>> x = Klass()
>>> setattr(x, 'a', 3)
>>> x.a
3
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21808905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档