介绍几款 Python 类型检查工具

微软在 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 倍呢?感兴趣的同学们可以去试试。有什么使用体会,欢迎留言

相信大家在学python的时候肯定会遇到很多难题,以及对于新技术的追求,这里推荐一下我们的Python学习扣qun:784758214,这里是python学习者聚集地!!同时,自己是一名高级python开发工程师,从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!每日分享一些学习的方法和需要注意的小细节

走进:python技术分享交流

原文地址:https://blog.51cto.com/14318113/2392590

时间: 2024-11-09 14:53:20

介绍几款 Python 类型检查工具的相关文章

Python静态检查工具

Python是一门动态语言.在给python传参数的时候并没 有严格的类型限制.写python程序的时候,发现错误经常只能在执行的时候发现.有一些 错误由于隐藏的比较深,只有特定逻辑才会触发,往往导致需要花很多时间才能将语法错误慢慢排查出来.其实有一些错误是很明显的,假如能在写程序的时候发现这些错误,就能提高工作效率. 注:习惯了C/C++等编译语言,使用像Python这种动态语言,总有点不放心,特别是搭建比较大的系统的时候.Python静态语法检查工具就出现了. Pyflakes(错误检查利器

python代码检查工具pylint 让你的python更规范

1.pylint是什么? Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅参考资料)和有潜在问题的代码.目前 Pylint 的最新版本是 pylint-0.18.1. Pylint 是一个 Python 工具,除了平常代码分析工具的作用之外,它提供了更多的功能:如检查一行代码的长度,变量名是否符合命名标准,一个声明过的接口是否被真正实现等等. Pylint 的一个很大的好

python语法检查工具

在终端写python脚本的时候,经常在写完脚本运行的时候,才发现错误.如果某些代码没有运行到,则其中的错误不会被检查出来.这是因为python是一门动态解释型语言.这与用gcc编译C等静态语言时可以发现全局的语法问题有所不同. 为了避免潜在的语法问题.我们在写完python脚本文件之后,最好给python脚本做个静态语法检查,以此来避免低级错误. 检查工具有pyflakes, pylint, pep8, flake8等.这里用pyflakes做一下简单的检查. 安装方法: https://pyp

Swift类型检查与转换

继承会发生在子类和父类中,如图所示,是一系列类的继承关系类图,Person是类层次结构中的根类,Student是Person的直接子类,Worker是Person的直接子类.这个继承关系类图的具体实现代码如下: class Person { var name : String var age : Int func description() -> String { return "\(name) 年龄是: \(age)" } convenience init () { self.

运营好一个自媒体公众号,你还需要一个错别字检查工具

众所周知,现在公众号运营已经是一个工作岗位了. 很多编辑都转行做内容运营了. 因为公众号吸引用户的首要因素是:内容. 公众号运营人员的能力,按照重要程度,让我们排序列出来: 第一是内容 第二是排版 第三是营销 有人说:排版就好比公众号的脸 , 我要说, 错别字就好象脸上的痘痘. 很多人都用微信公众号图文编辑器, 比如:i排版,秀米 , 这些都是让脸变得更好看一点, 但是脸上偶尔还是会出现痘痘. 几大内容来源,无论是 知乎, 简书, 豆瓣,还是 果壳网 这里面都经常出现错别字. 在此, 特别向你推

《从零開始学Swift》学习笔记(Day48)——类型检查与转换

原创文章,欢迎转载.转载请注明:关东升的博客 继承会发生在子类和父类之间,是一系列类的继承关系. 比如:Person是类层次结构中的根类.Student是Person的直接子类.Worker是Person的直接子类. 这个继承关系类的详细实现代码例如以下: class Person { var name: String var age: Int func description() -> String { return "\(name) 年龄是: \(age)" } conven

《从零开始学Swift》学习笔记(Day48)——类型检查与转换

原创文章,欢迎转载.转载请注明:关东升的博客 继承会发生在子类和父类之间,是一系列类的继承关系. 例如:Person是类层次结构中的根类,Student是Person的直接子类,Worker是Person的直接子类. 这个继承关系类的具体实现代码如下: class Person {     var name: String     var age: Int          func description() -> String {         return "\(name) 年龄是

vue项目配置使用flow类型检查

你是否经常在debug那些简单可避免的bug?可能你给函数传参的时候搞错了参数的顺序,或者本来应该传个Number类型的参数,你传了一个String类型?JavaScript的弱类型是这一类bug的罪魁祸首,静态类型语言中不存在此类bug.Flow就是JavaScript的静态类型检查工具,该库的目标在于检查JavaScript中的类型错误,开发者通常不需要修改代码即可使用,故使用成本很低.同时,它也提供额外语法支持,使得开发者能更大程度地发挥Flow的作用. 一.flow的安装 flow可以直

karloop介绍--hello world大家好,今天为大家介绍一款非常轻量级的的web开发框架,karloop框架。使用python开发 首先我们下载karloop源码进行安装。 源码地址 下载成

大家好,今天为大家介绍一款非常轻量级的的web开发框架,karloop框架.使用python开发 首先我们下载karloop源码进行安装. 源码地址 下载成功后解压,进入解压后的路径,进入终端,运行命令:sudo python setup.py install 如果是window系统,则打开cmd,运行:python setup.py install 下载安装成功后,我们写一个hello.py 内容如下: # coding=utf-8 from karloop.KarlBaseApplicati