假设我有这些文件:
- 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实际上会给出错误未定义变量'package2',但代码可以正常运行。
答案 0 :(得分:1)
当您从包中导入模块时,始终会导入包(如果它尚未在sys.modules
中,则已加载) - 这可能会导致在导入模块中绑定包名称的副作用,虽然这不能保证(取决于Python的实现和版本)。
并且,从模块内部导入某些内容(我个人厌恶的做法,但这是另一个问题)还必须确保模块已加载(如果它已经在sys.modules
中,它当然不需要再次加载,但如果不加载,则必须加载并放入sys.modules
)。
这两种行为(保证部分;-)都是关于包和模块的“完整性”:当你编写模块时,你可以确定,即使有人误导了选择要导入的位,它们只会影响自己模块中的名称绑定,但 模块将始终作为整体加载 。类似地,有人从你的软件包中导入一个模块(一个非常好的做法,BTW):你知道你的软件包__init__.py
将在任何事情发生之前被加载。当然,这使您有机会进行所有必要的检查和初始化!