Python 3在这种情况下不需要__init__.py吗?

6

假设我有以下内容:

src/
    __init__.py
    a.py
b.py

假设__init__.py是一个空文件,而a.py只有一行代码:
TESTVALUE = 5

假设 b.py 是以下代码:
from src import a

print(a.TESTVALUE)

现在在Python 2.7和Python 3.x中,运行b.py会得到结果(5)。

但是,如果我删除文件__init__.pyb.py在Python 3.x中仍然可以工作,但在Python 2.7中,我会得到错误:

Traceback (most recent call last):
  File "b.py", line 5, in <module>
    from src import a
ImportError: No module named src

为什么Python 2.7在这种情况下表现出不同的行为?

1个回答

10

Python 3支持无需 __init__.py 文件的命名空间包(namespace packages)。此外,这些包可以分布在多个目录中。这意味着所有在sys.path路径下包含*.py文件的目录都将被识别为包。

这在Python 3中打破了向后兼容性,在导入方面可能会遇到问题。一个典型的问题是当前工作目录中有一个类似于库名(如numpy)的目录,其中包含Python文件。虽然Python 2会忽略此目录,但Python 3将首先找到它并尝试从中导入库。我曾多次遭受过这种情况的困扰。


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