介绍一款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 相关文章推荐
在Docker上部署Python的Flask框架的教程
Apr 08 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
Python清空文件并替换内容的实例
Oct 22 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
Python简单基础小程序的实例代码
Apr 28 Python
解决Django中多条件查询的问题
Jul 18 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
Nov 19 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
keras 解决加载lstm+crf模型出错的问题
Jun 10 Python
linux mint中搜狗输入法导致pycharm卡死的问题
Oct 28 Python
Django正则URL匹配实现流程解析
Nov 13 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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
php快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
php 中文和编码判断代码
2010/05/16 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
js点击时关闭该范围下拉菜单之外的菜单方法
2018/01/11 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
Python实现字符串逆序输出功能示例
2017/06/24 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
使用django-crontab实现定时任务的示例
2018/02/26 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
中海讯通笔试题
2015/09/15 面试题
副厂长岗位职责
2014/02/02 职场文书
大学生职业生涯规划书
2014/03/14 职场文书
施工员岗位职责
2014/03/16 职场文书
先进班集体事迹材料
2014/12/25 职场文书
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers