橘智橘智
FakeOrange
预计阅读时间:1分钟55秒

关于Python维护的小技巧

不要让你的Python代码看着像是很多年前的

0
0

本文属于搬运:原文链接


我在不同公司和项目中看到了一些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+

感谢你参加我的“抱怨大会”!


评论