标哪里
中型项目里,时间浪费在“这个函数到底返回 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 文档。