你是不是也这样?写个小脚本,pip install一通乱装,代码全塞一个.py文件里,跑通就完事了。 😅
但项目一旦变大,这种“野路子”立马原形毕露:改一处,崩三处;新人接手,直接懵圈。
别再用脚本思维搞工程,目录结构是你的第一道防线
一个清晰的目录,胜过万行注释。 它不是束缚,而是导航图。看看这个经典布局:
my_project/
├── src/ # 源码放这里!别再和根目录混了
│ └── my_project/
│ ├── __init__.py
│ ├── core/ # 核心业务逻辑
│ ├── api/ # 接口层
│ └── utils/ # 工具函数
├── tests/ # 测试代码,与源码分离
├── docs/ # 文档
├── pyproject.toml # 现代Python项目的唯一真相之源
└── README.md
依赖管理:告别requirements.txt的混乱时代
还在用pip freeze > requirements.txt?这简直是给未来的自己挖坑! 🕳️
它会把所有间接依赖都打包进来,导致环境臃肿且难以复现。
拥抱pyproject.toml和Poetry吧! 声明式依赖,精准、干净、可重现。
# pyproject.toml
[tool.poetry.dependencies]
python = "^3.9"
requests = {version = "^2.25.0", extras = ["security"]}
pandas = {version = "^1.3.0", optional = true}
[tool.poetry.group.dev.dependencies]
pytest = "^6.2.0"
black = "^21.5b2"
配置即代码,别再让config.py满天飞
把配置当成代码的一部分来管理。 使用pydantic这样的库,不仅能做类型校验,还能轻松处理不同环境(开发、测试、生产)。
# config.py
from pydantic import BaseSettings
classSettings(BaseSettings):
database_url: str
debug: bool = False
secret_key: str
classConfig:
env_file = ".env"
settings = Settings()
一行settings.database_url,自动从.env文件或环境变量中读取,安全又灵活。
自动化一切,让你的双手只用来思考
格式化、静态检查、测试——这些重复劳动,交给机器!
一个简单的Makefile或noxfile.py,就能一键完成所有准备工作。
# noxfile.py
import nox
@nox.session(python=["3.9", "3.10"])
deftests(session):
session.install(".[dev]")
session.run("pytest", "tests/")
@nox.session
deflint(session):
session.install("flake8")
session.run("flake8", "src/")
每次提交前跑一遍,代码质量杠杠的,再也不用担心被同事吐槽。
测试不是负担,而是你大胆重构的底气
没有测试的代码,就是技术债。 尤其是在大型项目中,一个微小的改动可能引发雪崩。
从单元测试开始,逐步覆盖核心逻辑。pytest的简洁语法让你爱上写测试。
# tests/test_core.py
deftest_calculate_interest():
from my_project.core.finance import calculate_interest
assert calculate_interest(1000, 0.05, 1) == 50.0
看着绿色的测试通过提示,那种安全感,谁用谁知道!👍
日志与监控,让你的程序学会“说话”
当你的服务在深夜崩溃,日志就是唯一的救命稻草。 别再用print()了!
用标准库的logging模块,分级记录信息,方便追踪和排查。
import logging
logger = logging.getLogger(__name__)
defrisky_operation():
try:
# ... some code ...
logger.info("Operation succeeded")
except Exception as e:
logger.error("Operation failed: %s", e, exc_info=True)
raise
好的日志习惯,能让你从救火队员变成悠闲的架构师。