很多人刚学Python的时候,把代码全扔在一个文件里。项目大了,自己都找不到变量在哪。
一个合适的项目结构就像给工具箱分格子。螺丝刀放一个格子,扳手放一个格子。要用的时候伸手就能拿到。
我用了几年Python,踩过不少坑。下面这个模板是我觉得最省心的。
基础结构长这样
假设你的项目叫 my_project。
最外面是项目文件夹。里面放这些:
my_project/
├── my_package/ (你的代码包)
├── tests/ (测试文件夹)
├── config.py (配置文件)
├── requirements.txt(依赖列表)
├── setup.py (安装脚本,如果你要发布)
└── README.md (项目说明书)
这个布局简单直接。你要改什么,一眼就知道去哪找。
代码包 my_package 怎么分
这是核心。别把所有Python文件平摊在包里。
一个典型的包内目录是:
my_package/
├── __init__.py(包入口,空文件也行)
├── models.py(数据模型)
├── utils.py(小工具函数)
├── api.py(对外接口,比如网络请求)
└── exceptions.py(自定义错误)
如果你的项目逻辑更复杂,就再加子包。比如 my_package/services/ 放业务逻辑,my_package/database/ 放数据库操作。
每个子包里也要有一个 __init__.py 文件,哪怕它是空的。
测试和配置文件别乱放
tests/ 文件夹要对应你的包结构。
比如你在 my_package/models.py 里写了一个 User 类。那你就在 tests/test_models.py 里写测试。文件名前面加 test_,Python的 unittest 框架会自动找到。
config.py 放那些经常要改的东西。数据库地址,API密钥,日志级别。不要硬编码在代码里。
requirements.txt 是给别人用的。别人拿到项目,运行 pip install -r requirements.txt 就能装好所有依赖。
实际写代码时要注意的事
每个文件夹要加 __init__.py 文件。没有这个,Python不认为那是包。
模块内部导入路径要写清楚。比如在 my_package/services/user_service.py 里想要用 my_package/models.py 里的东西,就写 from my_package.models import User。不要用相对路径 from ..models import User,那样容易搞乱。
一个文件只做一类事情。数据库操作放在 database 文件夹,业务逻辑放 services,界面展示放 views。互不干扰。
常量单独放一个文件。比如 constants.py。把所有固定值写进去。以后要改价格、换API地址,只改这一个地方。
什么时候用这个模板
项目超过两个文件就值得用。哪怕是个小工具,按这个架子搭,后续加功能不会一团乱麻。
我见过有人为了省事,所有代码塞一个文件,最后3000行。找bug就像在一堆乱绳里找线头。回头自己都不想维护。
按这个模板搭好骨架之后,你可以随意调整。加模块删模块都不用怕。改一个地方,影响范围很清楚。
养成习惯,每次新建项目就拷贝这个结构。一年后你会感谢现在的自己。