Python|四年完成400万行Python代码检查,甚至顺手写了个编译器
文章插图
【Python|四年完成400万行Python代码检查,甚至顺手写了个编译器】作者丨Jukka Lehtosalo
作为 Python 的大用户之一 , Dropbox 公司内部聚集了数百万行 Python 代码 , 动态类型的存在让代码越来越难以理解 。 因此 , 公司开始利用 mypy 逐步将代码转换为静态类型 。 虽然效果得到了充分验证 , 但整个过程充满了各种错误和失败 。 本文 , Dropbox 公司完整输出了从项目研究到实践的 Python 静态检查全过程 , 以期对各位开发者有所帮助 。
事实上 , Python 已经成为 Dropbox 公司使用范围最广的语言 , 其广泛适用于后端服务与桌面客户端应用程序等(当然 , Dropbox 公司也在大量使用 Go、TypeScript 以及 Rust 等语言) 。 在 Dropbox 公司数以百万计的 Python 代码行中 , 动态类型的存在让代码越来越难以理解 , 并严重影响生产力水平 。 为了缓解这一问题 , Dropbox 公司一直在利用 mypy 逐步将代码转换为静态类型(顺带一提 , mypy 可能是目前 Python 当中最流行的独立类型检查器 , 属于开源项目 , 其核心开发团队来自于 Dropbox 。 ) 。
截至目前 , Dropbox 已经在成千上万个项目当中使用 mypy , 而且效果都得到了很好地验证 。 但对于此次全方位检查 Python 代码 , Dropbox 仍然抱着忐忑的心情 , 整个过程也充满了错误与失败 。 在今天的文章中 , Dropbox 将向大家分享 Python 静态检查之旅——从最早的学术研究项目 , 到现在逐步让类型检查与类型提示成为 Python 社区中众多开发人员的常规操作 。 现在 , 已经有多种工具支持类型检查功能 , 包括各类 IDE 与代码分析器等 。
文章插图
1、为什么要进行类型检查?如果开发者只使用过动态类型的 Python , 当然有可能对静态类型以及 mypy 感到陌生 。 甚至 , 不少开发者就是因为动态类型而喜欢上 Python , 但这事儿在逻辑上就有点莫名其妙 。 其关键应该在于 , 静态类型检查是实现规模化的前提:项目越大 , 需要的静态类型就越多 。
一旦项目中包含成千上万行代码 , 而且有多位工程师在同时使用 , 以往开发经验告诉我们 , 理解代码内容就成了保障开发人员工作效率的关键所在 。 如果没有类型注释 , 基本的代码作用推理(例如找到函数的有效参数 , 或者可能的返回值类型)就会成为一大难题 。 以下是几个在缺少类型注释时 , 开发人员难以回答的典型问题:
- 这个函数能返回 None 吗?
- 这里的 items 参数是干什么用的?
- id 属性是什么类型:到底是 int、str、抑或是自定义类型?
- 这个参数需要的是一份清单、一个元组还是一个组?
class Resource: id: bytes ... def read_metadata(self,items: Sequence[str]) -> Dict[str, MetadataItem]: ...
- read_metadata 并不会返回 None , 因为返回类型不是 Optional[…]
- items 参数代表一系列字符串 , 其不可能随意迭代 。
- id 属性为字节字符串 。
虽然 Python 在项目早期与中期阶段表现良好 , 但当项目发展到特定阶段后 , 成功的项目与使用 Python 语言的企业可能面临一个关键性决定:我们是否需要利用静态类型语言重写所有内容?类似 mypy 这样的类型检查器主要负责提供用于类型描述的形式语言 , 并通过验证所获得的类型与实现(以及可能存在的可选项)间的匹配解决这一难题 。 更具体地讲 , 类型检查器专门提供经过验证的文档 。
当然 , 除此之外 , 类型检查器还可带来其它助益:
- 类型检查器能够发现许多微妙(以及不那么微妙)的 bug 。 其中的典型例子 , 就是开发者忘记处理的 None 值或者其它一些特殊条件 。
- 重构更简单 , 因为类型检查器通常能够准确告诉我们需要变更的代码 。 我们不需要进行 100% 全覆盖测试 , 这本身也不具备可行性 。 另外 , 我们也不需要跟踪深层堆栈以了解到底出了什么问题 。
- 融资|小影科技完成近4亿元C轮融资,已启动上市
- 出海|出海日报丨短视频生产服务商小影科技完成近4亿元 C 轮融资;华为成为俄罗斯在线出售智能手机的第一品牌
- 手机|新鲜评测:让手机变身电脑的显示器见过没?只用4步即可完成!
- 生产|短视频生产服务商“小影科技”完成近4亿元C轮融资
- 网络|大禹网络完成数亿元人民币A轮融资
- 海沧|厦门海沧转动卫浴行业发展引擎 今年前十个月完成工业产值62.3亿元
- 苏宁|苏宁易购旗下云网万店完成 60 亿元 A 轮融资
- 视频剪辑|提供视频剪辑工具,小影科技完成近 4 亿元 C 轮融资
- 融资|酒水外卖平台“酒小二”宣布完成A轮融资
- 运维|全栈智能业务运维服务商云智慧完成 D3 轮 6000 万美元融资