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

时间:2010-08-17 02:35:37

标签: 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实际上会给出错误未定义变量'package2',但代码可以正常运行。

1 个答案:

答案 0 :(得分:1)

当您从包中导入模块时,始终会导入包(如果它尚未在sys.modules中,则已加载) - 这可能会导致在导入模块中绑定包名称的副作用,虽然这不能保证(取决于Python的实现和版本)。

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

这两种行为(保证部分;-)都是关于包和模块的“完整性”:当你编写模块时,你可以确定,即使有人误导了选择要导入的位,它们只会影响自己模块中的名称绑定,但 模块将始终作为整体加载 。类似地,有人从你的软件包中导入一个模块(一个非常好的做法,BTW):你知道你的软件包__init__.py将在任何事情发生之前被加载。当然,这使您有机会进行所有必要的检查和初始化!