4 款 Python 类型检查工具比照

作者 : 开心源码 本文共2156个字,预计阅读时间需要6分钟 发布时间: 2022-05-12 共210人阅读

近日,微软在 Github 上开源了一个 Python 静态类型检查工具:pyright ,引起了社区内的多方关注。

微软在开源项目上的参加力度是越来越大了,不说收购 Github 这种大的战略野心,只说它家开源的 VS Code 编辑器,在猿界已割粉无数,连我 Python 圈的红人 Kenneth Reitz(多个开源项目的作者,包括 requests、requests-html、responder等)都对它赞不绝口。

如今开源的 Pyright ,口碑还不错,那我们就来看看它有啥本事,顺便再详情其它几款类型检查工具。

众所周知,Python 是一门动态类型语言,在运行期才知道变量的实际类型。这本就是动态语言的特色,然而在团队合作或者大型项目上,维护的代价也不可避免,俗话说的是:“动态一时爽,重构火葬场 ”。

image

早在 2006 年的 PEP-3107,Python 就推出了函数注解的功能,最终落在 3.0 版本实现。而到了 3.5 版本,Python 继续引入了静态类型检查的语法(即 PEP-484,type hints)。2014 年的 PEP-483 更是以《The Theory of Type Hints》为题,做出了理论上的归纳。后来,又陆续提出了 PEP-526、PEP-544,类型检查的规范逐步丰富。

Python学习群:556370268,有大牛答疑,有资源共享!有想学习python编程的,或者是转行,或者是大学生,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入学习。

类型检查的好处是及早检查,提前发现类型的错误,加强代码的一致性与可维护性。(还有防止脱发,喵)

# 不加检查def greeting(name):    return 'Hello ' + name# 增加检查def greeting(name: str) -> str:    return 'Hello ' + name

如上例所示,添加检查后,可以在编译期就判断入参和返回值能否是字符串类型。

在微软推出 pyright 之前,主流的静态检查工具备三款:官方的mypy 、Google 出的pytype 、Facebook 出的pyre-check 。三足鼎立的局面要被打破了。

image

pyright 的文档声称它有如下特点:

  • 速度快。相较于 mypy 及其它用 Python 写的检查工具,它的速度是 5 倍甚至更多。

  • 不依赖 Python 环境。它用 TypeScript 写成,运行于 node 上,不依赖 Python 环境或者第三方包。

  • 可配置性强。支持自由地配置,支持指定不同的运行环境(PYTHONPATH 设置、Python 版本、平台目标)。

  • 检查项齐全。支持类型检查及其它语法项的检查(如 PEP-484、PEP-526、PEP-544),以及函数返回值、类变量、全局变量的检查,甚至可以检查条件循环语句

  • 命令行工具。它包含两个 VS Code 插件:一个命令行工具和一个语言服务器协议(Language Server Protocol)

  • 内置 Stubs 。使用的是 Typeshed 的副本。(注:使用静态的 pyi 文件,检查内置板块、标准库和三方件 )

  • 语言服务特性。悬停提醒信息、符号定义的跳转、实时的编辑反馈

就此而言,不可谓不强大。事实上,pyright 是“站在了巨人的肩膀上”,它的各项功能似乎都继承自其它几位前辈。

接着看官方的 mypy ,它由“Python 之父” Guido van Rossum 亲身参加开发,是最主流的选择,推出得早,客户基数大,文档与社区经验也最丰富。

在集成 IDE 方面,所有主流的编辑器都支持:PyCharm、Vim、Emacs、Sublime Text、VS Code、Atom……在业界经验上,Instagram 和 Dropbox 的项目从 py2 迁移到 py3 ,就是用的它来做保障。

接着看谷歌的 pytype ,据文档形容,它可以:

  • 标记常见错误,如拼写错误、函数调用错误

  • 增强自己设置的类型注解

  • 支持对 pyi 文件生成类型注解

查看文档,我发现它有个功能还挺人性化的,即“错误降噪 ”,对于那些不必修改的错误,可以增加注释,来消除类型检查。

此外,还有一个考虑也不错,为了写类型检查,板块中可能会额外引入其它的板块,对于后者,pytype 有办法隐藏它,只在做类型检查时才加载。

Python学习群:556370268,有大牛答疑,有资源共享!有想学习python编程的,或者是转行,或者是大学生,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入学习。

最后,要详情的是脸书的 pyre-check,它是去年开源的,也曾收获一片好评(说不定正是由于它,微软才上马了 pyright 项目也说不定)。

基本的功能点大同小异,不过它也是有亮点的。pyre-check 可集成Watchman 板块,该“观察者”会监听代码文件,跟踪所做的修改。微软的 pyright 有个 watch 模式,应该是吸收了这点,而且更加好用(由于不需要额外安装 Watchman 和其它依赖)。

pyre-check 还有个亮点,它有个query 参数,可以对源码做局部区域性的检查,例如查询某行中一个表达式的类型、查询一个类的一律方法并返回成列表,等等,这样可以避免做全面的检查。

4 种类型检查工具详情完毕,下面是一份概要比照:

image

至于它们的性能如何,能否真如 pyright 所说,它的速度是其它几个的 5 倍呢?感兴趣的同学们可以去试试。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 4 款 Python 类型检查工具比照

发表回复