我在尝试使用pymodm创建flask-extension
时注意到了这一点。
考虑pymodm.MongoModel
。
#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.py的collections()
。
options.py导入connections.py的方法_get_db
。
Models.py
导入connections.py的connect方法以添加与模块级变量的连接。
options.py导入connections.py的_get_db以某种方式设法从_CONNECTIONS
获得Models.py
更改的连接。
这背后的机制/概念是什么?模块级变量是全局的,如JavaScript
或我错过了什么?
答案 0 :(得分:0)
如果模块是由两个模块导入的,那么这两个模块应该有两个_CONNECTIONS实例而不是一个。
事实并非如此。
您的导入以这种方式工作,因为这是导入工作的方式。 public function pinDate($id)
{
$pin = Pin::find($id);
$pin->pin_date = \Carbon\Carbon::now();
$pin->save();
}
语句每次调用时都不会创建新模块。如果先前已导入模块,则后续导入只会绑定到原始模块。
考虑这三个文件:
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}")
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 a
和a
导入main
,b
也只会在第一次导入Inside a
时打印。这很重要:a
中的代码只执行一次。
对a
的修改会影响a.x
和a.x
。这也很重要。只有一个b.a.x
模块,因此只有一个a
模块命名空间。导入a
的任何人都会看到具有相同名称和相同对象的相同名称空间。