合理的包结构应按抽象层级组织:domain/(纯业务逻辑)、application/(用例实现)、infrastructure/(外部依赖适配)、interfaces/(对外入口)、tests/(镜像分层),并遵循分层清晰、依赖可控、配置隔离、可扩展设计等原则。

大型Python项目不是把所有代码塞进一个文件夹就完事的。合理的包结构能降低维护成本、提升协作效率、方便测试和部署,关键在于按职责分离、兼顾可扩展性、预留演进空间。
核心原则:分层清晰,边界明确
不要按“功能模块”粗暴切分,而要按抽象层级组织:
- domain/:纯业务逻辑,无框架依赖(如实体类、领域服务、值对象)
- application/:用例实现,协调domain与infra,含命令/查询处理器
- infrastructure/:外部依赖适配层(数据库ORM封装、HTTP客户端、消息队列驱动)
- interfaces/:对外暴露的入口(FastAPI路由、CLI命令、异步任务触发器)
- tests/:按被测层级组织(unit/、integration/、e2e/),与主代码结构镜像对应
包命名与导入:避免循环依赖
包名全部小写、无下划线,层级不宜超过三层。关键规则:
- 禁止跨层直接导入(如 interfaces 直接 import infrastructure.db.session)
- 用依赖注入或工厂函数解耦(例如 application 层通过接口接收 repository 实例)
- 在每个包的
__init__.py中显式导出公共接口,控制外部可见范围
配置与环境隔离:不写死,不硬编码
配置不是放在 settings.py 就算完事:
立即学习“Python免费学习笔记(深入)”;
- 拆分为
base.py(通用)、dev.py、prod.py,用pydantic.BaseSettings管理类型安全 - 敏感配置(密钥、地址)通过环境变量注入,绝不提交到代码库
- 用
python-dotenv在开发时自动加载.env,生产环境由运维注入
可扩展性设计:为未来留缝
一开始就预设插件机制和替换点:
- 定义抽象基类(ABC)作为 infra 接口(如
NotificationService),让不同渠道(Email/SMS/Slack)实现它 - 用
entry_points在setup.py或pyproject.toml中注册插件入口 - 预留
extensions/目录,存放非核心但可能被第三方集成的能力(如审计日志、指标上报)
不复杂但容易忽略。结构定型后,团队成员对“某段逻辑该放哪”会有共识,新人上手快,重构风险低。










