gpt4 book ai didi

从模块导入全局时,python 包会自动导入

转载 作者:行者123 更新时间:2023-11-28 18:55:17 25 4
gpt4 key购买 nike

假设我有这些文件:

- package1/
- __init__.py
- package2/
- __init__.py
- module1.py

package1/__init__.py的内容:

from package2.module1 import var1
print package2

package1/package2/__init__.py

package1/package2/module1.py的内容:

var1 = 123

问题是为什么 package2 会被导入?针对 package1/__init__.py 运行 pylint 实际上会给出错误 Undefined variable 'package2',但代码有效。

最佳答案

当您从一个包中导入一个模块时,该包总是首先被导入(加载,如果它还没有在 sys.modules 中)——这可能会产生绑定(bind)包名称的副作用在导入模块中,尽管不能保证(取决于 Python 实现和版本)。

而且,“从模块内部”导入某些东西(我个人讨厌这种做法,但那是另一个问题)还必须确保模块已加载(如果它已经在 sys.modules 中,则不会加载)当然不需要再次加载,但如果不需要,则必须加载并放入 sys.modules)。

这两种行为(保证部分;-)都是关于包和模块的“完整性”:当你编写一个模块时,你可以确定,即使有人误入歧途试图挑选并选择要导入的位,它们只会影响它们自己模块中的名称绑定(bind),但您的模块将始终作为一个整体加载。类似地,对于从您的包中导入模块的人(一个完全正确的做法,BTW):您知道您的包的 __init__.py 将首先加载,然后再发生任何事情。当然,这使您有机会进行所有需要的检查和初始化!

关于从模块导入全局时,python 包会自动导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3498929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com