首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -关于通过另外两种方式导入相同模块的困惑

Python -关于通过另外两种方式导入相同模块的困惑
EN

Stack Overflow用户
提问于 2017-04-10 02:22:40
回答 1查看 117关注 0票数 1

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

Models.py (用户自定义模块)

代码语言:javascript
复制
#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.pycollections()options.py导入connections.py_get_db方法。

Summery:

Models.py导入connections.py的connect方法,将连接添加到模块级变量。options.py导入了connections.py的_get_db,不知何故设法从_CONNECTIONS获得了一个连接,但被Models.py更改了。

这背后的机制/概念是什么?模块级变量是否像JavaScript中那样是全局变量,或者我是否遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2018-04-07 04:07:04

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

事实并非如此。

您的导入是这样工作的,因为这就是导入的工作方式。import语句不会在每次调用时创建新模块。如果该模块之前已导入,则后续导入将简单地绑定到原始模块。

考虑以下三个文件:

main.py

代码语言:javascript
复制
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

代码语言:javascript
复制
x = 3
print(f"Inside a, x={x}")

b.py

代码语言:javascript
复制
import a
print(f"Inside b, a.x={a.x}")

还有这个python3.6会话:

代码语言:javascript
复制
$ 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行只打印一次。即使同时从mainb导入a,也只在第一次导入a时打印Inside a。这一点很重要:a中的代码只执行一次。
  • a.x的修改会同时影响a.xb.a.x。这一点也很重要。只有一个a模块,因此只有一个a模块命名空间。任何导入a的人都将看到具有相同名称和相同对象的相同命名空间。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43310310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档