Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—关于通过其他两个模块导入相同模块的混淆_Python_Mongodb_Python Import_Pymodm - Fatal编程技术网

Python—关于通过其他两个模块导入相同模块的混淆

Python—关于通过其他两个模块导入相同模块的混淆,python,mongodb,python-import,pymodm,Python,Mongodb,Python Import,Pymodm,我在尝试使用创建烧瓶扩展时注意到了这一点。 考虑使用 PyMODM.ManggOMDEL ./P>的用例。 Models.py(用户定义的模块) 模块的connect方法的有趣之处在于,它使用一个名为\u CONNECTIONS的模块级变量来存储所有连接。 在#第2行中导入连接到当前名称空间后,我们将使用连接方法向_CONNECTIONS添加连接 然后,在第4行中,我们调用了模块的TopLevelMongoModel类的save方法,该类间接调用的集合()。 导入的方法\u get\u db

我在尝试使用创建
烧瓶扩展时注意到了这一点。
考虑使用<代码> PyMODM.ManggOMDEL  ./P>的用例。
Models.py(用户定义的模块)
模块的
connect
方法的有趣之处在于,它使用一个名为
\u CONNECTIONS
的模块级变量来存储所有连接。 在
#第2行
中导入连接到当前名称空间后,我们将使用连接方法向
_CONNECTIONS
添加连接

然后,在第4行中,我们调用了模块的TopLevelMongoModel类的save方法,该类间接调用的集合()。 导入的方法
\u get\u db

萨默里:
Models.py
导入的连接方法以向模块级变量添加连接。 导入以某种方式管理的数据库,以从
\u CONNECTIONS
获取连接,该连接由
Models.py
更改

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

如果一个模块由两个模块导入,那么这两个模块应该有两个\u连接实例,而不是一个

事实并非如此

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

考虑以下三个文件:

main.py a、 派克 b、 派克 而本次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
注意两件重要的事情:

  • 一行内的
    仅打印一次。即使从
    main
    b
    导入
    a
    ,a
    内部的
    仅在第一次导入
    a
    时打印。这一点很重要:
    a
    中的代码只执行一次

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

如果一个模块由两个模块导入,那么这两个模块应该有两个\u连接实例,而不是一个

事实并非如此

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

考虑以下三个文件:

main.py a、 派克 b、 派克 而本次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
注意两件重要的事情:

  • 一行内的
    仅打印一次。即使从
    main
    b
    导入
    a
    ,a
    内部的
    仅在第一次导入
    a
    时打印。这一点很重要:
    a
    中的代码只执行一次

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


我不知道你在问什么。只有一个
\u CONNECTIONS
实例被其他两个模块使用;这为什么令人惊讶呢?嗯。。如果一个模块由两个模块导入,那么这两个模块应该有两个
\u连接实例
而不是一个..但是为什么呢?你怎么会这么想?如果您将一个对象分配给两个名称,那么您仍然只有一个对象,而不是两个。根本问题是:为什么/如何在应用程序级别设置扩展配置?我不确定您在问什么。只有一个
\u CONNECTIONS
实例被其他两个模块使用;这为什么令人惊讶呢?嗯。。如果一个模块由两个模块导入,那么这两个模块应该有两个
\u连接实例
而不是一个..但是为什么呢?你怎么会这么想?如果将一个对象分配给两个名称,则仍然只有一个对象,而不是两个。根本问题是:为什么/如何在应用程序级别设置扩展配置?
x = 3
print(f"Inside a, x={x}")
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