4款Python 类型检查工具,你选择哪个呢?


Posted in Python onOctober 30, 2020

微软在 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 种类型检查工具介绍完毕,下面是一份概要对比:

4款Python 类型检查工具,你选择哪个呢?

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

以上就是4款Python 类型检查工具,你选择哪个呢?的详细内容,更多关于Python 类型检查工具的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python中使用sys模板和logging模块获取行号和函数名的方法
Apr 15 Python
零基础写python爬虫之抓取百度贴吧代码分享
Nov 06 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
Jun 01 Python
python调用java的jar包方法
Dec 15 Python
python实现PID算法及测试的例子
Aug 08 Python
python打开使用的方法
Sep 30 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 Python
详解python常用命令行选项与环境变量
Feb 20 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
Feb 26 Python
Python递归实现打印多重列表代码
Feb 27 Python
Kmeans均值聚类算法原理以及Python如何实现
Sep 26 Python
python实现三种随机请求头方式
Jan 05 Python
python从PDF中提取数据的示例
Oct 30 #Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
Oct 30 #Python
python boto和boto3操作bucket的示例
Oct 30 #Python
python 多进程和协程配合使用写入数据
Oct 30 #Python
python打包生成so文件的实现
Oct 30 #Python
pytorch 移动端部署之helloworld的使用
Oct 30 #Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
Oct 30 #Python
You might like
PHP 数组教程 定义数组
2009/10/23 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
2016/11/05 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
javascript数据类型验证方法
2015/12/31 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
2016/12/14 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
VUE中v-model和v-for指令详解
2017/06/23 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
Python网络编程详解
2017/10/31 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
担保书怎么写
2014/04/01 职场文书
优秀共产党员演讲稿
2014/09/04 职场文书
党员教师群众路线对照检查材料思想汇报
2014/09/29 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
高考升学宴主持词
2019/06/21 职场文书
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电