python 3.7包真的不需要__init__.py吗?

Maz*_*mia 6 python testing package python-3.7

最近创建了一个flask应用,决定在应用文件夹外添加一个test文件夹(app和test文件夹都在同一个目录下)。我要测试的所有实现都包含在 app 文件夹中创建的包和模块中。

__init__.py 文件在两个文件夹中都可以正常工作。但是,当我从测试文件夹中删除 __init__.py 文件时,我开始遇到 moduleImportError。Python 文档说 __init__.py 文件不再是 python 3.3+ 中包的要求,但在我这里的情况下,似乎这是一个要求。有人可以解释为什么会这样吗?

小智 9

快速回答,是的,多亏了隐式命名空间包,__init__.py不再需要文件。但是非标准库包括一些工具,单元测试设置工具还需要__init__.py的文件。

在大多数情况下,我推荐以下项目树状:

setup.py
src/
    mypkg/
        __init__.py
        app.py
        view.py
tests/
    __init__.py
    foo/
        __init__.py
        test_view.py
    bar/
        __init__.py
        test_view.py
Run Code Online (Sandbox Code Playgroud)

顶级包src和根文件夹不需要__init__.py文件。每个其他子模块都需要一个__init__.py文件。

通过遵循此规则,大多数工具成功地发现了模块,包括 unittest、pytest 和 setuptools。

  • 如果像 pytest 和 unittest 这样的一些工具仍然需要 \__init__.py 文件,那么说包不再需要它并不完全正确。 (6认同)