Python 3.7包是否真的不需要__init__.py文件?

6

最近我创建了一个Flask应用程序,并决定在应用程序文件夹之外添加一个测试文件夹(应用程序和测试文件夹都在同一个目录下)。我将为其进行测试的所有实现都包含在创建在应用程序文件夹中的包和模块中。

当两个文件夹中都有__init__.py文件时,一切都像预期的那样正常运行。但是,当我从测试文件夹中删除__init__.py文件时,我开始遇到moduleImportError。Python文档说,__init__.py文件不再是Python 3.3+中包的要求,但在我的情况下似乎是必需的。有人能解释一下吗?


也许这可以回答你的问题?https://dev59.com/71oU5IYBdhLWcg3wxIyA - Lapis Rose
不是这样的。那里的答案说当_init.py文件为空时,可以将其删除。在我的情况下,我遇到了导入错误,并且调试了几个小时,直到我决定在测试文件夹中添加空的_init.py文件,问题才得以解决。 - Mazimia
可能有些困难,但你能否准备一个 [MCVE]? - Paritosh Singh
1
@Mazimia,实际上那个问题的答案说__init__.py有时是必需的,即使是空的,在较新版本的Python中也是如此。 - Flimm
这个回答是否解决了你的问题?init.py在Python 3.3+的包中是否不再是必需的? - Flimm
1个回答

13
快速回答,是的,由于隐式命名空间包,您不再需要__init__.py文件。 但是一些标准库工具,包括unittestsetup tools仍然需要__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

顶级包src和根目录不需要__init__.py文件。其他所有子模块都需要__init__.py文件。

按照这个规则,大多数工具都可以成功地发现模块,包括unittest、pytest和setuptools。


10
如果一些工具,如pytest和unittest仍然需要_init_.py文件,则说它不再是包必需的并不完全正确。 - Mazimia

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