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

标签 python import

假设我有这些文件:

- 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/

相关文章:

javascript - Electron :为什么会出现 'Uncaught ReferenceError: require is no defined.' ?

Python - 相对导入

python - 每组相邻列内的连续差异

python - 如何处理图像分类的可变图像尺寸?

python - pandas 中的并行字符串替换

python - 我无法使用 ctypes 访问 C++ 类属性

python - 如何在 Python 中获取字符串的前 2 个字母?

python - 导入相关包进行测试

php - 将csv文件导入mysql并同时更改日期时间格式

python - 避免 Python 中的相对导入和 sys.path