第 14 期 2026 年 8 月 广东

搜索
我的生活点滴

技术笔记与学习备忘

2026-06-09 后端 约 9 分钟 陈予安

Python 类型标注在中型项目里真正省下的时间

我不再追求 mypy 零错误。标注花在边界上:配置、对外函数、跨模块的数据结构。脚本和一次性转换函数可以不标。

笔记本电脑上的代码

标哪里

中型项目里,时间浪费在“这个函数到底返回 None 还是空列表”。公共 API、服务层入参、从 JSON 解析出来的对象,值得写成明确类型。循环变量和极短的辅助函数,标注只会增加噪音。

我用 from __future__ import annotations,避免循环引用时写引号。Python 3.11 之后的 list[str]List[str] 更干净。

dict 换成明确结构

配置对象最容易变成 dict[str, Any]。三个模块之后,谁也不知道有没有 timeout 这个键。我改成 dataclass 或 TypedDict:

from dataclasses import dataclass

@dataclass(frozen=True, slots=True)
class RedisConf:
    host: str
    port: int
    db: int = 0

只读配置用 frozen。改配置变成显式构造新对象,比在字典里悄悄改键安全。

对外部 JSON,先用 TypedDict 描述已知字段,未知字段不要用 **kwargs 吞掉。多出来的键说明文档和实现已经分叉。

检查放在 CI,不要放在保存时

编辑器即时 mypy 会打断思路。我只在 CI 和提交前跑 mypy --pretty,并允许测试目录放宽。目标不是满分,是拦住“把 User 传成了 user_id”这种错误。

第三方库没有 stub 时,不要全局 ignore_missing_imports。只对那一个模块写 override。否则真正缺标注的自己的代码也会被放过。

语言参考:typing 文档