从模块导入全局变量时,Python包会自动导入。

3

假设我有以下这些文件:

- 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?运行pylint对package1/__init__.py进行检查会出现错误Undefined variable 'package2',但代码可以正常工作。
1个回答

1

当您从包内导入模块时,该包始终首先被导入(如果它尚未在sys.modules中加载),这可能会导致将包的名称绑定到导入模块中,但这并不保证(取决于Python实现和版本)。

而且,导入“从模块内部”的内容(我个人非常反感的做法,但这是另一个问题)也必须确保该模块已加载(如果它已经在sys.modules中,则当然不需要再次加载,但如果没有,则必须加载并放入sys.modules中)。

这些行为(保证的部分;-)都与包和模块的“完整性”有关:当您编写一个模块时,您可以确信,即使有人误导地尝试挑选要导入的位,他们只会影响自己模块中的名称绑定,但是您的模块将始终被整体加载。同样,对于从您的包中导入模块的人(顺便说一句,这是完全可以的实践):您知道您的包的__init__.py将首先被加载,然后才会发生任何事情。当然,这给了您进行所有必要的检查和初始化的机会!


谢谢你的回答。你知道在哪里可以找到更多关于“副作用”的信息吗?我做了一些谷歌搜索,但没有得到任何有用的结果。 - sayap
在 http://effbot.org/zone/import-confusion.htm 上有一篇关于导入的通用教程(虽然已经过时但仍然清晰易懂)。该教程不包括关于包和 __init__.py 的内容。官方教程在 http://docs.python.org/tutorial/modules.html 可以找到相关信息。 - Alex Martelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接