Python包开发测试策略及本地模块发现等技术问题咨询
Python包开发相关问题解答
你的项目当前文件结构如下:
my_project/ core/ foo.py bar.py ... test/ test_foo.py test_bar.py examples/ example0.py
针对你提出的问题,逐一解答如下:
问题1:Python 3中是否需要__init__.py?是否只需顶层创建my_module.py列出核心模块?
Python 3.3+引入了命名空间包,这类特殊场景的包可以不用__init__.py,但常规本地开发的包,还是建议给core目录加上__init__.py:
- 明确标识这是Python包,避免和普通目录混淆;
- 可以在文件里导出核心模块的类/函数,简化用户调用(比如
from my_project.core import Foo,不用写冗长的from my_project.core.foo import Foo); - 兼容部分老工具、测试框架,它们仍依赖
__init__.py识别包结构。
至于顶层的my_module.py完全没必要,规范做法是给my_project根目录也加个__init__.py,把core作为子包,用户直接通过import my_project.core引用即可。
问题2:本地开发时让模块可被发现,无需每次修改都pip install的方法?
最符合Python风格的是可编辑安装:
先在my_project根目录创建pyproject.toml(遵循PEP 621标准,定义包名、版本、依赖等信息),然后执行:
pip install -e .
这会在Python环境里创建一个指向本地项目的链接,修改代码后直接运行example0.py就能生效,不用重复安装。
如果不想用pip,也可以临时给Python加路径:在example0.py开头加这段代码:
import sys from pathlib import Path sys.path.append(str(Path(__file__).parent.parent))
但这种方法只适合快速测试,长期开发还是推荐可编辑安装,避免污染路径。
问题3:单元测试文件如何让模块可被发现?
有三种常用方案:
- 配合可编辑安装:如果已经用
pip install -e .装了包,测试文件直接import core.foo或from my_project.core import foo就能正常导入,不用额外操作; - 临时添加路径:在测试文件开头加路径处理代码,和上面例子类似,把项目根目录加入
sys.path; - 用测试框架自动识别:比如用
pytest的话,直接在项目根目录运行pytest,它会自动识别规范的包结构(带__init__.py),无需手动配置路径。
Python包开发与测试的常规策略
开发阶段
- 规范包结构:除现有目录,添加顶层
pyproject.toml定义包信息,替代传统的setup.py; - 用虚拟环境:每个项目单独建虚拟环境(
python -m venv venv),激活后再装依赖和做可编辑安装,避免依赖冲突; - 代码风格管控:用
black自动格式化代码,flake8检查风格问题,保证代码一致性; - 加类型提示:给函数、类加类型注解,用
mypy做静态类型检查,提升代码可读性和健壮性。
测试阶段
- 单元测试优先:每个核心模块对应一个测试文件,覆盖关键功能,用
pytest做测试框架,比自带的unittest更简洁灵活; - 自动化测试:用
pre-commit钩子,每次提交代码自动触发测试、格式检查; - 监控覆盖率:用
pytest-cov生成覆盖率报告,确保核心代码都被测试覆盖; - 集成测试补充:针对多模块交互的功能,编写集成测试验证整体流程。
发布前准备
- 写文档:用
sphinx生成文档,模块、函数注释遵循Google或NumPy风格; - 版本管理:用语义化版本号(如v0.1.0、v0.1.1),用
bump2version辅助管理; - 锁定依赖:用
pip freeze > requirements.txt或poetry/pipenv管理依赖,保证安装环境一致。
内容的提问来源于stack exchange,提问作者fearless_fool
相关产品推荐
相关产品推荐

