假设我有这些文件:
- 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/