首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >`vars`和`setattr`有什么区别?

`vars`和`setattr`有什么区别?
EN

Stack Overflow用户
提问于 2019-02-27 11:31:14
回答 1查看 455关注 0票数 1

在使用vars更改db.Model(flask-sqlalchemy)值失败后,我使用setattr解决了这个问题,但在阅读文档后仍然没有得到varssetattr之间的区别。

以下是我尝试过的方法

vars中失败

代码

代码语言:javascript
复制
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def set_option_parameters(var, option_keys, options):
    for option_key in options:
        if option_key in option_keys and options[option_key] is not None:
            vars(var)[option_key] = options[option_key]
            # setattr(var, option_key, options[option_key])

class Application(db.Model):
    id = db.Column(db.BigInteger(), primary_key=True, autoincrement=True)
    name = db.Column(db.VARCHAR(20), nullable=False)
    ...
    def __init__(self, options):
        option_keys = set(["name"])
        set_option_parameters(self, option_keys, options)

    def modification(self, options):
        modifiable = set(["name"])
        set_option_parameters(self, modifiable, options)

vars(var)[option_key] = options[option_key]在初始化Application对象时工作良好,但在modification中失败(name没有改变)。

日志/测试

我试着在db.session.commit()之前打印application.__dict__,它确实被修改了!

代码语言:javascript
复制
application = Application.query.filter_by(id=args["id"]).first()
# args["name"] is not None
app.logger.info(f"Before: {application.__dict__}")
application.modification(args)
app.logger.info(f"After: {application.__dict__}")
db.session.commit()

输出

代码语言:javascript
复制
[2019-02-27 11:22:59,209] INFO in equipmentbaseapplicationhandler: Before:{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7f718ac2b588>, 'id': 9, 'name': 'old_name'}
[2019-02-27 11:22:59,209] INFO in equipmentbaseapplicationhandler: After:{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7f718ac2b588>, 'id': 9, 'name': 'new_name'}

当我签入mysql时,它不工作。

setattr中获得成功

然后我在function set_option_parameters中更改为setattr(var, option_key, options[option_key])

它在初始化和修改中都工作得很好,application.__dict__的输出也是一样的!

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54897575

复制
相关文章

相似问题

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