我为什么需要
这个问题在这里已经有了答案:
是的,如果您要将目录视为模块,则需要此文件。
需要__init__.py
文件才能使Python将目录视为包含包; 这是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径中发生的有效模块。 在最简单的情况下, __init__.py
可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__
变量,稍后介绍。
https://docs.python.org/3/tutorial/modules.html#packages
我尝试创建非空的__init__.py
。 通过在第一级提供最有用的对象(类/函数),您可以很好地记录模块,从而摆脱用户/开发人员的嵌套导入......实际上尽可能简单地使用与之相比 - 我们可以说 - java导入
问题更新后编辑
默认导入器/查找器(检查sys.meta_path
)是:
第三个是__init__.py
东西(实际上也是FrozenImporter)。
PathFinder
从sys.path
(和包中定义的__path__
)中搜索PathFinder
中的模块。 该模块可以是独立的python文件(如果它位于搜索路径的根目录中),也可以是具有__init__.py
目录。
参考你的例子:
foo/
bar/
__init__.py
baz.py
如果您在foo/
创建_init__.py
, foo.bar.baz
将可用(如您所说)。
如果你添加foo/
到sys.path
或者通过PYTHONPATH=foo/
传递它, bar.baz
将可用(注意没有父模块foo)。
如果你编写你自己的发现者(和Loader),你可以加载任何你想要的文件,而不管它在哪里。 这给了你强大的力量。 例如,看看stack-overflow-import
,根据SO的搜索结果公开代码。
上一篇: Why do I need