1

我在尝试flask-extension使用pymodm创建时注意到了这一点。考虑一个用例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.pyconnect模块方法 的有趣之处在于,它使用一个模块级变量调用来存储所有连接。在将连接导入到当前名称空间后,我们正在使用连接方法添加连接。_CONNECTIONS#line 2_CONNECTIONS

然后,在 中,我们调用了models.py#line 4模块的 TopLevelMongoModel 类的 save 方法,该方法间接调用了options.pyoptions.py导入connections.py的方法。collections()_get_db

总结:

Models.py导入connections.py 的connect 方法添加到模块级变量的连接。 options.py导入 _get_db of connections.py以某种方式设法获得了一个由.py_CONNECTIONS更改的连接Models.py

这背后的机制/概念是什么?模块级变量是全局变量JavaScript还是我遗漏了什么?

4

1 回答 1

0

如果一个模块由两个模块导入,那么这两个模块应该有两个 _CONNECTIONS 实例而不是一个。

事实并非如此。

您的导入以这种方式工作,因为这就是导入的工作方式。该import语句不会在每次调用时创建一个新模块。如果该模块先前已导入,则后续导入只需绑定到原始模块。

考虑这三个文件:

主文件

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}")

一个.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行只打印一次。即使amain和导入bInside a也仅在第一次a导入时打印。这很重要:其中的代码a只执行一次。

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

于 2018-04-06T20:07:03.907 回答