【问题标题】:How do I make changes to module-level objects stick in Python? (like Pylons meta objects)如何对 Python 中的模块级对象进行更改? (如 Pylons 元对象)
【发布时间】:2012-06-24 14:36:32
【问题描述】:

我正在开发一个使用 SQLAlchemy 进行数据库访问的 Python 服务器应用程序。我想在 meta.py 模块中包含引擎、会话和元数据对象,这些对象在整个程序中用于访问数据库(如 Pylons 约定)。

engine和session对象在meta.py模块中初始化为None,然后在其他模块中实际赋值。例如

model/meta.py:

engine = None
Session = None
metadata = Metadata()

model/__init__.py:

from simplesite.model import meta

def init_model():
    # ...
    sm = orm.sessionmaker(...)
    meta.Session = orm.scoped_session(sm)

问题是当我在另一个模块中导入并运行init_model(),然后从meta.py导入Session,它仍然设置为None。即

from model.meta import Session
from model import init_model

init_model()
# Session is still None!

谁能告诉我这是为什么和/或它在 Pylons 应用程序中是如何工作的?我猜答案会是关于 Python 工作原理的更基本的东西?

对于如何在整个应用程序中实现单点数据库访问的替代建议也将不胜感激(即在大型应用程序中使用 SQLAlchemy 的最佳实践)。

【问题讨论】:

  • 你正在做的很好。问题是from model.meta import Sessionmeta.Session 中的值绑定到名称Session,当名称meta.Session 更改时它不会更改。相反,只需执行from model import meta,然后将Session 查找为meta.Session
  • 事实上,想想如果来自另一个模块的代码可以改变你的局部变量,那该有多不爽!!
  • 谢谢,这就是我正在寻找的答案。我现在使用 from model import meta,然后通过 meta.Session 引用该对象,它可以工作
  • 请回答并关闭问题。

标签: python sqlalchemy pylons


【解决方案1】:

我正在回答这个问题,因为它看起来只是坐在这里,尽管@katrielalex 在 cmets 中给出了答案。

当您执行from model.meta import Session 时,您将创建一个名为Session 的新局部变量,该变量绑定到来自该模块的对象。当init_model() 运行时,它会重新绑定meta 模块内的名称,但这不会影响您的局部变量。

init_model() 完成工作之前,您可以通过不访问meta.Session 来达到您想要的效果:

from model import meta
from model import init_model
init_model()
Session = meta.Session

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多