介绍一款python类型检查工具pyright(推荐)


Posted in Python onJuly 03, 2019

近日,微软在 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

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

介绍一款python类型检查工具pyright(推荐)

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

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

  1. 速度快。相较于 mypy 及其它用 Python 写的检查工具,它的速度是 5 倍甚至更多。
  2. 不依赖 Python 环境。它用 TypeScript 写成,运行于 node 上,不依赖 Python 环境或第三方包。
  3. 可配置性强。支持自由地配置,支持指定不同的运行环境(PYTHONPATH 设置、Python 版本、平台目标)。
  4. 检查项齐全。支持类型检查及其它语法项的检查(如 PEP-484、PEP-526、PEP-544),以及函数返回值、类变量、全局变量的检查,甚至可以检查条件循环语句
  5. 命令行工具。它包含两个 VS Code 插件:一个命令行工具和一个语言服务器协议(Language Server Protocol)
  6. 内置 Stubs 。使用的是 Typeshed 的副本。(注:使用静态的 pyi 文件,检查内置模块、标准库和三方件 )
  7. 语言服务特性。悬停提示信息、符号定义的跳转、实时的编辑反馈

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

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

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

接着看谷歌的 pytype ,据文档描述,它可以:

  1. 标记常见错误,如拼写错误、函数调用错误
  2. 加强自定义的类型注解
  3. 支持对 pyi 文件生成类型注解

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

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

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

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

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

4 种类型检查工具介绍完毕,下面是一份概要对比:

介绍一款python类型检查工具pyright(推荐)

至于它们的性能如何,是否真如 pyright 所说,它的速度是其它几个的 5 倍呢?感兴趣的同学们可以去试试。有什么使用体会,欢迎留言与我交流。

 项目地址:

https://github.com/python/mypy

https://github.com/Microsoft/pyright

https://github.com/google/pytype

https://github.com/facebook/pyre-check

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
Feb 13 Python
python之线程通过信号pyqtSignal刷新ui的方法
Jan 11 Python
Python遍历文件夹 处理json文件的方法
Jan 22 Python
详解python列表生成式和列表生成式器区别
Mar 27 Python
Python Django实现layui风格+django分页功能的例子
Aug 29 Python
python实现智能语音天气预报
Dec 02 Python
关于pytorch处理类别不平衡的问题
Dec 31 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
Django重设Admin密码过程解析
Feb 10 Python
tensorflow实现二维平面模拟三维数据教程
Feb 11 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 Python
python 如何实现遗传算法
Sep 22 Python
Python flask框架post接口调用示例
Jul 03 #Python
Python3安装psycopy2以及遇到问题解决方法
Jul 03 #Python
python调试神器PySnooper的使用
Jul 03 #Python
详解DeBug Python神级工具PySnooper
Jul 03 #Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 #Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
Jul 03 #Python
在cmd中查看python的安装路径方法
Jul 03 #Python
You might like
计数器详细设计
2006/10/09 PHP
PHP个人网站架设连环讲(四)
2006/10/09 PHP
PHP 和 XML: 使用expat函数(二)
2006/10/09 PHP
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
php基本函数汇总
2015/07/09 PHP
php数组比较实现查找连续数的方法
2015/07/29 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
php递归函数怎么用才有效
2018/02/24 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
Jquery实现控件的隐藏和显示实例
2014/02/08 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
了解JavaScript表单操作和表单域
2019/05/27 Javascript
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
Python 使用office365邮箱的示例
2020/10/29 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
城管综合整治方案
2014/05/01 职场文书
承诺书样本
2014/08/30 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
中学生逃课检讨书
2015/02/17 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
Java spring定时任务详解
2021/10/05 Java/Android
Promise静态四兄弟实现示例详解
2022/07/07 Javascript