关于Python维护的小技巧
不要让你的Python代码看着像是很多年前的
本文属于搬运:原文链接
我在不同公司和项目中看到了一些Python的使用方式,这些方式显得繁琐、难以维护,而且有些过于陈旧了。下面是我的建议:
使用 PyProject.toml 替代 requirements.txt
不要再在 README.md 中写“安装依赖:pip install -r requirements.txt”。尽管 pip 可以做到,但并不意味着我们应该这样做。requirements.txt 是个意外形成的标准,直接使用 pyproject.toml 更加合理,不仅 pip 能理解其中内容,你还可以在文件中定义开发环境或特定依赖组,这样就不必再使用“dev-requirements.txt”以及一堆CI/CD流水线规则。
使用 Python 版本和项目管理工具,比如 Poetry 或 UV
Poetry 和 UV 都能读取 pyproject.toml 文件,处理依赖、构建、在沙盒中运行应用程序,还能管理 Python 版本等。学习这些工具只需花费一个小时,但能为你省去许多麻烦。最低要求是使用 venv 这样的虚拟环境来避免全局依赖冲突。此外,UV 安装依赖的速度比 pip 快得多。
使用类型提示
类型提示提升了代码的可读性,还能帮助类似 ruff 和 mypy 这样的静态分析工具理解代码。这样你的同事也会更喜欢你的代码。例如:
def alter_map(data: Map) -> None:
"""修改二维地图中的数据,直接改变被引用的对象"""
for x in map:
for y in map[x]:
transmute(map[x][y])
给函数的所有参数、返回类型添加类型提示。
在函数的文档字符串中添加 Raises 部分
尽管有人可能会认为这种做法并不能真正避免坏代码,但它确实有助于维护。在文档字符串中加入 Raises 部分,列出可能在函数中触发的异常,可以帮助减少代码中的意外情况。
使用 Pydantic 模型而不是 dicts 或多个参数传递数据
对于那些数据几乎不变的代码片段,直接定义一个 Pydantic 类不仅能实现错误处理、类型检查,还可以将所有数据传递作为一个函数参数,使代码更整洁。
使用 Ruff 这样的代码格式化和检查工具
在 Python 中可以使用 Ruff 来格式化代码,它速度很快,还能检查一些常见问题。可以在 pyproject.toml 中加入以下规则来进一步提升代码质量:
#toml file
[tool.ruff]
target-version = "py12"
[tool.ruff.lint]
extend-select = [
'D', # pydocstyle
'E', 'W', # pycodestyle
'F', # pyflakes
'I', # import 排序
'UP', # pyupgrade
"RUF", # Ruff 自定义规则
"SIM", # pyflakes 简化规则
"C90", # 更复杂的规则
]
优先选择 Pytest 而不是 unittest
在可以转换的地方,使用 Pytest 替代 unittest。Pytest 的 fixture 功能非常强大且具备复用性。
可选改进(热辣建议)
- 使用 orjson 而非内置的 json 库
- 使用 f 字符串而非字符串拼接、.format 或 %s 格式化
- 使用 pathlib 而非 os.path
- 使用 click 而非 argparse 或 sys.argv
- 升级到 Python 3.8+
感谢你参加我的“抱怨大会”!