有用且仍推荐保留,它是明确标识包最可靠的方式;虽Python 3.3+支持隐式命名空间包,但存在工具兼容、相对导入失败等局限,并提供初始化入口、API控制及结构意图表达等不可替代功能。

有用,而且依然推荐保留。
它仍是明确标识包的最可靠方式
虽然 Python 3.3+ 引入了隐式命名空间包(PEP 420),允许没有 __init__.py 的目录也被识别为包,但这种机制有局限:
- 仅适用于纯路径型包(比如只含模块、无初始化逻辑)
- 部分工具链(如 pytest、mypy、IDE 导入解析、打包工具 setuptools)仍依赖 __init__.py 判断包边界
- 缺少该文件时,某些相对导入(from . import xxx)会直接失败
它提供不可替代的初始化入口
只要包被导入,__init__.py 中的代码就会自动执行一次。这个特性在现代项目中仍广泛用于:
- 预设包级变量(如 __version__、__author__)
- 统一配置日志、警告过滤或全局设置
- 触发轻量级环境检查(如依赖版本校验)
- 延迟加载耗资源的子模块(避免首次导入过慢)
它是控制公共 API 的核心枢纽
用户不希望看到你的内部工具模块(如 _utils.py 或 legacy/),而只想用 from mypkg import load, dump。这靠的就是 __init__.py 的显式导出:
立即学习“Python免费学习笔记(深入)”;
- 用 from .core import load, dump 汇聚接口
- 用 __all__ = ["load", "dump"] 精确约束 from mypkg import *
- 隐藏实现细节,让包结构更稳定、更易维护
空文件也有实际价值
即使只留一个空的 __init__.py,它也在传递清晰意图:“这个目录是设计为包来使用的”。这种显式性符合 Python 之禅,也避免团队成员误删关键结构、或新同事困惑“为什么这个文件夹不能被 import”。










