【问题标题】:Cross module variable sharing without duplicating imports跨模块变量共享而不重复导入
【发布时间】:2016-07-07 06:27:03
【问题描述】:

我有一个带有一些数据逻辑的模块models.py

db = PostgresqlDatabase(database='database', user='user')

# models logic

和实际与数据库交互的烧瓶应用程序:

from models import db, User, ...

但我想从烧瓶应用程序中的一个配置文件中初始化所有设置:

所以我可以将db 与其他东西分开(我需要这个来访问models 中的模块变量db):

import models
from models import User, ...
app.config.from_object(os.environ['APP_SETTINGS'])
models.db = PostgresqlDatabase(database=app.config['db'],
                               user=app.config['db'])

并进一步将db 用作models.db

但看起来有点丑。重复导入,模块内容的不同用法..

有没有更好的方法来处理这种情况?

【问题讨论】:

  • from somewhere import db 很糟糕——这意味着数据库永远无法重新初始化,因此您的应用程序无法动态更改配置。它也使单元测试变得更加困难,你最终会在许多模块中模拟出相同的数据库。

标签: python python-2.7 scope python-module


【解决方案1】:

我建议使用 1 级间接,这样你的代码就会变成这样:

import const
import runtime

def foo():
    runtime.db.execute("SELECT ... LIMIT ?", (..., const.MAX_ROWS))

你得到:

  • 叶模块const的明确分离
  • 可以模拟和/或重新加载
  • 所有用户模块中的统一和简洁的访问

要在 runtime 上获得丰富的 API,请使用“在导入时用对象替换模块”技巧(请参阅 __getattr__ on a module

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多