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中关于日期时间处理的问答集锦
Mar 08 Python
python转换摩斯密码示例
Feb 16 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
Python实现脚本锁功能(同时只能执行一个脚本)
May 10 Python
python环形单链表的约瑟夫问题详解
Sep 27 Python
python多进程并行代码实例
Sep 30 Python
关于初始种子自动选取的区域生长实例(python+opencv)
Jan 16 Python
python集合能干吗
Jul 19 Python
Pyqt助手安装PyQt5帮助文档过程图解
Nov 20 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 Python
python数据分析之用sklearn预测糖尿病
Apr 22 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
May 10 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中实现简单的ACL 完结篇
2011/09/07 PHP
利用PHP函数计算中英文字符串长度的方法
2014/11/11 PHP
PHP实现简单实用的验证码类
2015/07/29 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
7个JS基础知识总结
2014/03/05 Javascript
jquery实现效果比较好的table选中行颜色
2014/03/25 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
微信小程序 登陆流程详细介绍
2017/01/17 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
Node.js爬虫如何获取天气和每日问候详解
2019/08/26 Javascript
JavaScript动态生成表格的示例
2020/11/02 Javascript
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
python中实现延时回调普通函数示例代码
2017/09/08 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
python爬虫爬取幽默笑话网站
2019/10/24 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
python cv2.resize函数high和width注意事项说明
2020/07/05 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
浅析移动设备HTML5页面布局
2015/12/01 HTML / CSS
实习单位接收函
2014/01/11 职场文书
组织关系转移介绍信
2014/01/16 职场文书
幼儿园义卖活动方案
2014/01/17 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
小学生倡议书范文
2014/05/13 职场文书
党员对照检查材料思想汇报(党的群众路线)
2014/09/24 职场文书
单位婚育证明范本
2014/11/21 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
Python帮你解决手机qq微信内存占用太多问题
2022/02/15 Python
微信小程序实现轮播图指示器
2022/06/25 Javascript