Python - 关于通过另外两个模块导入相同模块的困惑

时间:2017-04-09 18:22:40

标签: python mongodb python-import pymodm

我在尝试使用pymodm创建flask-extension时注意到了这一点。 考虑pymodm.MongoModel

的用例

Models.py(用户定义的medule)

#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方法添加到_CONNECTIONS的连接。

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

综述:

Models.py导入connections.py的connect方法以添加与模块级变量的连接。 options.py导入connections.py的_get_db以某种方式设法从_CONNECTIONS获得Models.py更改的连接。

这背后的机制/概念是什么?模块级变量是全局的,如JavaScript或我错过了什么?

1 个答案:

答案 0 :(得分:0)

  

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

事实并非如此。

您的导入以这种方式工作,因为这是导入工作的方式。 public function pinDate($id) { $pin = Pin::find($id); $pin->pin_date = \Carbon\Carbon::now(); $pin->save(); } 语句每次调用时都不会创建新模块。如果先前已导入模块,则后续导入只会绑定到原始模块。

考虑这三个文件:

main.py

import

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

b.py

x = 3
print(f"Inside a, x={x}")

和这个python3.6会话:

import a
print(f"Inside b, a.x={a.x}")

注意两件重要的事情:

  • $ 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 aa导入mainb也只会在第一次导入Inside a时打印。这很重要:a中的代码只执行一次。

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