【问题标题】:How to initialise long-lived variables?如何初始化长寿命变量?
【发布时间】:2014-08-16 20:26:32
【问题描述】:

我开始我的第一次主要涉足 Python 的领域是 C# 和 Java。到目前为止还不错,但我似乎无法理解的一个概念是如何初始化将在许多模块和包中使用的长期变量?

在 C# 中,我可以有一个 EnvironmentConfig 类,在应用启动时实例化并通过依赖注入或其他可以保存值的机制传递。

作为一个具体的例子,我正在使用 SQLAlchemy 进行数据库插入。我创建了一个模块 db.py,其中包含如下所示的 db 代码:

engine = create_engine('dburl', echo=True)

conn = engine.connect()

metadata = MetaData()

table_mytable = Table('mypackage', metadata,
    Column('id', String, primary_key=True),
    Column('mystuff', String),

ins = table_mytable.insert()    

def insert():
    result = conn.execute(ins)

然后其他代码导入我的db 模块并利用insert 函数进行插入。

我遇到的问题是,每次我导入我的 db 模块以供使用时,engineconnmetadatatable_my_table 变量都会重新创建,因此基本上对于我重新连接的每个导入到db 并重新定义所有元数据?

这是正确和预期的事情吗?还是有更好的方法来解决这个问题?

【问题讨论】:

    标签: python


    【解决方案1】:

    我遇到的问题是,每次我导入我的 db 模块以供使用时,engineconnmetadatatable_my_table 变量是否会重新创建,所以基本上对于我重新连接的每个导入到db 并重新定义所有元数据?

    没有。 Python缓存导入:被导入过的模块不会再次被导入,但是被导入的模块会被重用。

    您可以通过在某个目录中放置 test.py 来验证这一点:

    print("foo")
    

    并启动一个 python 解释器:

    >>> import test
    foo
    >>> import test
    

    您会注意到代码只运行一次。

    或者有没有更好的方法来解决这个问题?

    因此,拥有模块全局变量是保持状态的有效方法,需要在整个程序运行期间保持状态。

    【讨论】:

    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 2019-12-07
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多