4款Python 类型检查工具,你选择哪个呢?
作者:silencement 发布时间:2021-10-29 22:30:27
微软在 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 倍呢?感兴趣的同学们可以去试试。
来源:https://www.py.cn/toutiao/14940.html


猜你喜欢
- 一、图像的加法图像相加可以直接利用numpy模块进行相加,也可以采用opencv里面函数进行相加,注意事项:相加的图像类型、大小必须相同具体
- yaml 文件的应用场景与格式介绍yaml 文件的应用场景yaml其实也类似于 json、txt ,它们都属于一种文本格式。在我们的实际工作
- 简介Closure所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭
- MySQL批量插入数据脚本#!/bin/bashi=1;MAX_INSERT_ROW_COUNT=$1;while [ $i -le $MA
- 前言本文主要给大家介绍了关于python卸载再安装遇到问题的解决方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧解决方法
- SQL Server中加密是层级的,每一个上层为下提供保护。如图:实例:/** SMK(Service Master Key)在SQL Se
- 在上一篇文章中,简单介绍了下闭包(closure)和原型链,现在继续来研究闭包的内部机制。对了,所有的东西都参考自这篇文章:Javascri
- 在CentOS上安装MySQL数据库服务器后,系统出于安全性考虑,缺省不支持用户通过非本机连接上数据库服务器,如果想让用户通过另外一台机器连
- 使用PHP开发应用程序,尤其是网站程序,常常需要生成随机密码,如用户注册生成随机密码,用户重置密码也需要生成一个随机的密码。随机密码也就是一
- NICE!大家好,在上一章节,我们学习了 multiprocessing 模块 的关于进程的创建与进场常用的方法的相关知识。 通过在一个主进
- 不知道大家在面试或者工作过程中有没有被 mouseover 和 mouseenter (对应的是 mouseout 和 mouseleave
- 在ASP输出页面只是调出数据库里内容展现给用户看没有使用SESSION等动态属性,是可以CACHE的,以加快访问速度具体操作方法如下:在as
- 以下排序算法最终结果都默认为升序排列,实现简单,没有考虑特殊情况,实现仅表达了算法的基本思想。冒泡排序内层循环中相邻的元素被依次比较,内层循
- 先由exp把数据卸出到文件系统, 产生一个.dmp文件, 然后必要时再由imp将数据装入数据库. 对于一般中小型数据库来说, 全数据库的ex
- 深度学习中,模型训练完后,查看模型的参数量和浮点计算量,在此记录下:1 THOP在pytorch中有现成的包thop用于计算参数数量和FLO
- 如何下载:我先去MySQL首页下载最新版本的MySQL-链接:https://www.mysql.com/downloads/进入此界面下载
- 共轭转置共轭转置The symbols (·)T , (·)∗, and (·)H are,respectively, the transp
- 我们在学习keras经常会看到下面这样的代码段:查阅官方文档可以知道:我们知道彩色图像一般会有Width, Height, Channels
- 一、前言因为最近刚好被问到这个问题,但是自己当时特别懵逼,导致没有做出来。所以下来后自己Google了很多IoU的博客,但是很多博客要么过于
- 内容摘要:最近在做项目的时候,客户要求表格里的数据可以拖选,于是用JS写了个下面的方法。支持IE、FIREFOX等浏览器。实现对整行、整列数