微软在 GitHub 上开源了一个 Python 静态类型检查工具: pyright , 引起了社区内的多方关注.
微软在开源项目上的参与力度是越来越大了, 不说收购 GitHub 这种大的战略野心, 只说它家开源的 VS Code 编辑器, 在猿界已经割粉无数, 连我们 Python 圈的红人 Kenneth Reitz (多个开源项目的作者, 包括 requests,requests-html,responder 等) 都对它赞不绝口.
如今开源的 Pyright , 口碑还不错, 那我们就来看看它有啥本事, 顺便再介绍其它几款类型检查工具.
众所周知, Python 是一门动态类型语言, 在运行期才知道变量的实际类型. 这本就是动态语言的特色, 然而在团队合作或大型项目上, 维护的代价也不可避免, 俗话说的是:"动态一时爽, 重构火葬场".
早在 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, 类型检查的规范逐渐丰富.
类型检查的好处是及早检查, 提前发现类型的错误, 增强代码的一致性与可维护性.(还有防止脱发, 喵)
- # 不加检查
- def greeting(name):
- return 'Hello' + name
- # 添加检查
- def greeting(name: str) -> str:
- return 'Hello' + name
如上例所示, 增加检查后, 可以在编译期就判断入参和返回值是否是字符串类型.
在微软推出 pyright 之前, 主流的静态检查工具有三款: 官方的 mypy ,Google 出的 pytype ,Facebook 出的 pyre-check . 三足鼎立的局面要被打破了.
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 有办法隐藏它, 只在做类型检查时才加载.
最后, 要介绍的是脸书的 pyre-check, 它是去年开源的, 也曾收获一片好评 (说不定正是因为它, 微软才上马了 pyright 项目也说不定).
基本的功能点大同小异, 不过它也是有亮点的. pyre-check 可集成 Watchman 模块, 该 "观察者" 会监听代码文件, 跟踪所做的修改. 微软的 pyright 有个 watch 模式, 应该是吸收了这点, 而且更加好用 (因为不需要额外安装 Watchman 和其它依赖).
pyre-check 还有个亮点, 它有个 query 参数, 可以对源码做局部区域性的检查, 例如查询某行中一个表达式的类型, 查询一个类的全部方法并返回成列表, 等等, 这样可以避免做全面的检查.
4 种类型检查工具介绍完毕, 下面是一份概要对比:
至于它们的性能如何, 是否真如 pyright 所说, 它的速度是其它几个的 5 倍呢? 感兴趣的同学们可以去试试. 有什么使用体会, 欢迎留言
相信大家在学 python 的时候肯定会遇到很多难题, 以及对于新技术的追求, 这里推荐一下我们的 Python 学习扣 qun:784758214, 这里是 python 学习者聚集地!! 同时, 自己是一名高级 python 开发工程师, 从基础的 python 脚本到 web 开发, 爬虫, django, 数据挖掘等, 零基础到项目实战的资料都有整理. 送给每一位 python 的小伙伴! 每日分享一些学习的方法和需要注意的小细节
走进: python 技术分享交流 http://0x9.me/9LBJY
来源: http://www.bubuko.com/infodetail-3054426.html