Python关于用两个其他模块导入同一模块的混淆

2024-09-20 22:54:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试用pymodm创建flask-extension时注意到了这一点。 考虑一个pymodm.MongoModel的用例。你知道吗

你知道吗型号.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的模块级变量来存储所有连接。 将connect导入#line 2中的当前名称空间后,我们将使用connect方法向_CONNECTIONS添加一个连接。你知道吗

然后,在#line 4中,我们调用models.py模块的TopLevelMongoModel类的save方法,它间接调用options.pycollections()options.py导入connections.py的方法_get_db。你知道吗

总结:

Models.py导入connections.py的connect方法,向模块级变量添加连接。 options.py导入{a2}的{getdb}以某种方式设法从{}获取一个连接,该连接由{}更改。你知道吗

这背后的机制/概念是什么?模块级变量是像JavaScript中那样的全局变量还是我遗漏了什么?你知道吗


Tags: 模块方法namepyflaskfieldsmodelsave
1条回答
网友
1楼 · 发布于 2024-09-20 22:54:17

if a module is imported by two modules, those two modules should have two instances of _CONNECTIONS not one.

事实并非如此。你知道吗

你的导入是这样工作的,因为导入就是这样工作的。import语句不会在每次调用时创建新模块。如果该模块以前已导入,则后续导入只需绑定到原始模块。你知道吗

考虑以下三个文件:

你知道吗主.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行只打印一次。即使a是从mainb导入的,但Inside a仅在a第一次导入时才打印。这一点很重要:a中的代码只执行一次。

  • a.x的修改同时影响a.xb.a.x。这一点也很重要。只有一个a模块,因此只有一个a模块命名空间。任何导入a的人都将看到具有相同名称和相同对象的相同命名空间。

相关问题 更多 >

    热门问题