我开始第一次从C#和Java开始进军Python。到目前为止还不错,但是我似乎无法理解的一个概念是如何初始化将在许多模块和包中使用的长寿命变量?
在C#中,我可以在app启动时实例化Environment
或Config
类,并通过依赖注入或其他可以保存值的机制传递。
作为一个具体的例子,我使用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
函数进行插入。
我遇到的问题是,每次导入我的数据库模块以供使用时,都会重新创建engine
,conn
,metadata
和table_my_table
个变量所以基本上每次导入我都会重新连接到db
并重新定义所有元数据?
这是正确的和预期的吗?或者有更好的方法来解决这个问题吗?
答案 0 :(得分:2)
我遇到的问题是,每次导入我的数据库模块以供使用时,都会重新创建
engine
,conn
,metadata
和table_my_table
个变量所以基本上每次导入我都会重新连接到db
并重新定义所有元数据?
没有。 Python缓存导入:一旦导入的模块将不再导入,但导入的模块将被重用。
您可以通过在某个目录中放置test.py
来验证这一点:
print("foo")
并启动python解释器:
>>> import test
foo
>>> import test
您会注意到代码只运行一次。
或者有更好的方法来解决这个问题吗?
因此,拥有模块全局变量是保持整个程序运行所需的状态的有效方法。