其他
读写 Python 代码时用类型系统与惯用法消除非法状态…
在编写或修改 .py、pyproject.toml、requirements.txt 等 Python 文件时,用类型优先、函数式与规范化的错误处理/日志惯用法提升代码健壮性。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
读写 Python 代码时用类型系统与惯通用
解决思路
- 用 frozen dataclass 建模不可变的领域模型:在 dataclass 上加 frozen=True,避免意外修改(如 User(id, email, name, created_at))。
- 用 Literal 构造可辨识联合(discriminated union):为每个分支加 status: Literal["success"] / Literal["error"] 字段,再用 `RequestState = Success | Failure` 组合类型。
- 对可辨识联合用 `match` 语句做穷尽式分支处理:`case Success(data=data): ...` / `case Failure(error=err): ...`。
- 用 NewType 定义领域基本类型区分同类底层类型:如 `UserId = NewType("UserId", str)`、`OrderId = NewType("OrderId", str)`,让类型检查器阻止把 OrderId 传给需要 UserId 的函数。
- 用 Protocol 做结构化类型(鸭子类型)标注:定义带 `read(self, n: int = -1) -> bytes` 的 Readable 协议,函数参数标注为 Readable 即可接受任何实现了 read() 的对象,无需继承。
- 异常处理时用 `raise ... from err` 链式抛出以保留原始 traceback:捕获 `json.JSONDecodeError as err` 后 `raise ValueError(f"invalid JSON payload: {err}") from err`。
- 使用模块级 logger(如 `logger = logging.getLogger("myapp.widgets")`),并用 `%s` 延迟插值格式化日志:`logger.debug("creating widget: %s", name)`,不要用 f-string 直接拼接。
- 可选:用 Astral 的 ty 做快速类型检查,无需安装直接运行 `uvx ty check`,或对指定路径运行 `uvx ty check src/`。
- 可选:在 pyproject.toml 中配置 ty,例如 `[tool.ty]` 下设置 `python-version = "3.12"`。
- 按场景选择类型检查器:ty 最快、适合 CI 和大型代码库(但处于早期、快速演进阶段);pyright 类型推断最完整、与 VS Code 集成好;mypy 成熟、插件生态丰富。
适用边界 · 注意事项
- 只适用于 Python 文件(.py、pyproject.toml、requirements.txt);其他语言的惯用法不适用。
- ty 仍处于早期、快速演进阶段,若项目需要稳定成熟或依赖丰富插件生态,应继续用 mypy/pyright,而不要贸然切换。