在尝试使用pymodm创建flask-extension时,我注意到了这一点。考虑pymodm.MongoModel的用例。
Models.py (用户自定义模块)
#line 1
from pymodm import MongoModel, fields,connect
#line 2
connect("mongodb://localhost:27017/project_matrix")
#line 3
class Model(MongoModel):
name = fields.CharField()
#line 4
Model({"name": "test"}).save()关于connections.py模块的connect方法的有趣之处在于,它使用一个名为_CONNECTIONS的模块级变量来存储所有连接。在#line 2中导入connect到当前名称空间之后,我们将使用connect方法添加一个到_CONNECTIONS的连接。
然后,在#line 4中,调用models.py模块的TopLevelMongoModel类的save方法,间接调用options.py的collections()。options.py导入connections.py的_get_db方法。
Summery:
Models.py导入connections.py的connect方法,将连接添加到模块级变量。options.py导入了connections.py的_get_db,不知何故设法从_CONNECTIONS获得了一个连接,但被Models.py更改了。
这背后的机制/概念是什么?模块级变量是否像JavaScript中那样是全局变量,或者我是否遗漏了什么?
发布于 2018-04-07 04:07:04
如果一个模块是由两个模块导入的,那么这两个模块应该有两个_CONNECTIONS实例,而不是一个。
事实并非如此。
您的导入是这样工作的,因为这就是导入的工作方式。import语句不会在每次调用时创建新模块。如果该模块之前已导入,则后续导入将简单地绑定到原始模块。
考虑以下三个文件:
main.py
import a
import b
print(f"main, imports complete, a.x={a.x}, b.a.x={b.a.x}")
a.x = 7
print(f"modified a.x, a.x={a.x}, b.a.x={b.a.x}")a.py
x = 3
print(f"Inside a, x={x}")b.py
import a
print(f"Inside b, a.x={a.x}")还有这个python3.6会话:
$ python3.6 main.py
Inside a, x=3
Inside b, a.x=3
main, imports complete, a.x=3, b.a.x=3
modified a.x, a.x=7, b.a.x=7注意两件重要的事情:
Inside a行只打印一次。即使同时从main和b导入a,也只在第一次导入a时打印Inside a。这一点很重要:a中的代码只执行一次。a.x的修改会同时影响a.x和b.a.x。这一点也很重要。只有一个a模块,因此只有一个a模块命名空间。任何导入a的人都将看到具有相同名称和相同对象的相同命名空间。https://stackoverflow.com/questions/43310310
复制相似问题