127、mypy 静态类型检查:渐进式 typing 的配置、忽略策略与 CI 集成
从一次凌晨的线上事故说起
凌晨两点,告警电话把我从床上拽起来。生产环境的一个数据处理管道突然崩溃,错误信息指向一个NoneType对象没有split方法。我盯着代码看了十分钟——一个函数返回了Optional[str],但调用方直接当str用了。更讽刺的是,这个函数三个月前重构过,当时我还在代码里写了# type: ignore因为“太忙了没时间修类型”。
那晚之后,我决定认真对待 mypy。不是那种“装个插件就完事”的认真,而是真正把静态类型检查嵌入到开发流程里。这篇文章就是那之后积累的经验,希望能帮你少踩几个坑。
mypy 不是银弹,但它是你的第二双眼睛
很多人对静态类型检查有误解,觉得 Python 是动态语言,加类型就是“脱裤子放屁”。但当你维护过十万行以上的代码库,经历过“改一个参数类型,全局崩一片”的噩梦,你就会明白:类型注解不是给解释器看的,是给未来那个凌晨三点被叫醒的你写的。
mypy 的核心理念是“渐进式”——你不需要一夜之间把所有代码都加上类型。你可以从核心模块开始,慢慢向外辐射。这比 TypeScript 那种“要么全有要么全无”的哲学要务实得多。