Python 模块的魔法入口——__init.py__ 实战指南
我们在使用 python 库的时候会发现库内很多文件夹下都有一个__init__.py文件,有时候一个库里所有的代码都写在里面,有时候就是一个空文件,非常迷惑。
今天我们就来聊聊 Python 模块的入口__init__.py。

开门见山的说,__init__.py 的职责只有一个:把目录变成包,但“里面写不写东西、写多少”完全取决于你想让包长成什么样。
假设你的包名是 mypkg,下面给出一套“从简到繁”的最佳实践清单,按需取用即可。
- 最简单的空文件
什么都不写也能让import mypkg成功。适合一次性脚本或内部工具。
# mypkg/__init__.py(空文件即可)
- 暴露公共 API(99 % 的库都要)
# mypkg/__init__.py
from ._core import run_counter# 内部实现
from ._types import CounterResult # 公开的数据类
__all__ = ["run_counter", "CounterResult"] # 控制 from mypkg import * 的行为
__version__ = "1.2.0"# 方便 mypkg.__version__
要点
• 只在 __init__.py 里放“用户需要直接用的名字”,其余留作内部模块。
• 用 __all__ 明确导出,静态检查工具(mypy、pyright)也省心。
如果不配置
__all__和__version__会怎么样?只写这两行,包可以正常被 Python 识别,但会出现几个“副作用”:
- 任何 from mypkg import * 会一股脑把 run_counter 和 CounterResult 都导出去
因为没有 all,所以星号导入会把当前命名空间里所有非下划线开头的名字全带走(这里刚好就是那两个,所以没有影响)。多数情况下这不是你想要的,因为以后再加内部变量也会被导出。- IDE / 静态检查器(mypy、pyright)
它们依旧能找到 mypkg.run_counter,所以开发体验没问题;
但缺少 all 会让静态工具在“哪些符号是公有”这件事上给出更宽松的提示。- 没有 version 等元数据
用户无法import mypkg; print(mypkg.__version__),发布到 PyPI 时也不符合常见约定。- 没有懒加载、日志初始化等高级需求
如果包很小,这些可以忽略;中大型库通常需要。
- 延迟加载 & 子包懒导入(中大型库)
# mypkg/__init__.py
from typing import TYPE_CHECKING
if TYPE_CHECKING:
# 仅给类型检查器看
from . import utils, io, plot
__all__ = ["run_counter", "plot"]
__version__ = "1.2.0"
# 运行时再真正 import,降低启动开销
def __getattr__(name: str):
if name == "run_counter":
from ._core import run_counter as rc
return rc
raise AttributeError(f"module {__name__} has no attribute {name}")
- 配置 logging、插件注册、元数据
# mypkg/__init__.py
import logging
from importlib.metadata import version
__version__ = version("mypkg")
# 默认给库打日志,但不污染用户根 logger
logging.getLogger(__name__).addHandler(logging.NullHandler())
# 自动注册插件(若需要)
from . import _plugins; _plugins.register()
- 可选:设置
__path__(高级)
当你想把一个大包拆成多个物理目录(namespace package),才需要去动 __path__,99 % 的情况不需要。
简单总结一下
__init__.py 就是包的“门面”。
• 只想让目录可导入 → 空文件。
• 想做库 → 至少写 __version__ 和公开 API。
• 想优化启动或做复杂结构 → 加懒导入、日志、插件注册等。
Python 模块的魔法入口——__init.py__ 实战指南的更多相关文章
- python创建__init.py__文件导入模块仍然报错ModuleNotFoundError: No module named 'name'
今自定义模块后非相同目录导出提示找不到模块报错信息如下: ModuleNotFoundError: No module named 'name' 各方查找各位大神方法很多 参考链接 1.在需要导入的文 ...
- python模块及包的导入
一.模块 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".".pyo".".pyc".&q ...
- Python模块之configpraser
Python模块之configpraser 一. configpraser简介 用于处理特定格式的文件,其本质还是利用open来操作文件. 配置文件的格式: 使用"[]"内包含 ...
- Python模块学习
6. Modules If you quit from the Python interpreter and enter it again, the definitions you have made ...
- python模块导入细节
python模块导入细节 官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码文件按照功能可以分为两种类型: ...
- Python模块定义和使用
Python中所谓的模块就是一个Python文件,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块.模块由代码.函数或类组成.编程中使用模块不仅可以提 ...
- Python模块——logging模块
logging模块简介 logging模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统.logging模块是Python的一个标准库模块, 由标准库模块提供日志记录API的关键好处是 ...
- python 模块和包
一,模块 1,什么是模块? 常见的场景: 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py 的后缀. 但其实 import 加载的模块分为四个通用类别: 1,使用pyt ...
- 1、Python模块和包(0602)
模块.异常.运行环境.mysqldb 模块: 顶层文件:作为整个文件的程序入口,就是负责去调用其他文件中的代码来实现程序流程功能的,称为顶层程序文件, 模块文件1 模块文件2 python模块 1.可 ...
- python模块之 fabric
Python模块之Fabric Fabric简介 Fabric是一个Python库,可以通过SSH在多个host上批量执行任务.你可以编写任务脚本,然后通过Fabric在本地就可以使用SSH在大量 ...
随机推荐
- 基于Cherry Studio + DeepSeek 搭建本地私有知识库!
在当今数字化时代,知识管理变得越来越重要.无论是个人还是企业,都希望能够高效地存储.管理和检索知识.而借助 AI 技术,我们可以实现更加智能的知识库系统.本文将详细介绍如何使用 Cherry Stud ...
- 在使用import win32api时,报错:No module named win32api
二.在使用import win32api时,报错:No module named win32api 网上查到有下面解决办法: pip install pypiwin32 或 pip3 install ...
- Redis安装-Docker版
目录 Redis安装 docker版 拉取镜像 准备目录 编写配置文件 redis配置文件 redis启动命令 windows redis GUI管理工具redis-insight 配置连接 Redi ...
- 浅谈鸿蒙跨平台开发框架ArkUI-X
之前写过使用uniapp的跨平台开发鸿蒙项目,今天分享一下开发体验更友好的跨平台开发框架ArkUI-X. ArkUI-X看起来像是鸿蒙官方的框架,在DevEco中就可以安装和使用,而且会ArkUI就可 ...
- JavaScript编程实践:打造优雅健壮的代码
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- 基于 SSE、asp.net core razor 实现比分Live
前言 最近在项目中用到了 SSE (Server-Sent Events),用于服务的单向长连接数据推送.因为都是使用 C# 实现的,所以服务端使用的是 HttpListener ,而客户端更简单,只 ...
- 洛谷 P1549 [NOIP1997 提高组] 棋盘问题
洛谷 P1549 [NOIP1997 提高组] 棋盘问题 Problem 构造一个\(n\times n(n\le 10)\)的矩阵,在矩阵中填入\(1,2,\dots,n^2\),使得任意相邻的数之 ...
- 图扑软件 | 带你体验 Low Poly 卡通三维世界
在三维场景搭建中,图扑软件提供了多样化的设计风格,以满足不同项目的视觉需求.无论是写实风格的细腻渲染.科幻未来的赛博质感,还是简约现代的几何美学,都能通过灵活的工具体系实现.而今天,我们将重点介绍一种 ...
- 在Linux下使用wxWidgets进行跨平台GUI开发(二)
wxWidgets常见辅助类的应用示例 wxWidgets提供了一系列功能强大的辅助类(Helper Classes),涵盖了字符串处理.文件操作.XML解析.数据流.数据库和网络通信等功能,这些类为 ...
- equals与==与hashCode的区别与联系
equals与hashcode的区别与联系 1."=="与equals的区别与联系 (1)"=="对于基本数据类型,只要值相等,就返回true,否则返回fals ...