首页 > 编程语言 >介绍几款 Python 类型检查工具

介绍几款 Python 类型检查工具

时间:2022-10-14 14:03:24浏览次数:76  
标签:pyright 检查 Python PEP 开源 类型 工具 几款

 

近日,微软在 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​​​​pytype​​​​pyre-check​​ 。三足鼎立的局面要被打破了。

介绍几款 Python 类型检查工具_python

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

介绍几款 Python 类型检查工具_开源项目_02

至于它们的性能如何,是否真如 pyright 所说,它的速度是其它几个的 5 倍呢?感兴趣的同学们可以去试试。有什么使用体会,欢迎留言与我交流。

 

项目地址:

​https://github.com/python/mypy​

​https://github.com/Microsoft/pyright​

​https://github.com/google/pytype​

​https://github.com/facebook/pyre-check​

 

介绍几款 Python 类型检查工具_python_03

公众号【Python猫】, 专注Python技术、数据科学和深度学习,力图创造一个有趣又有用的学习分享平台。本号连载优质的系列文章,有喵星哲学猫系列、Python进阶系列、好书推荐系列、优质英文推荐与翻译等等,欢迎关注哦。PS:后台回复“爱学习”,免费获得一份学习大礼包。

 

 



标签:pyright,检查,Python,PEP,开源,类型,工具,几款
From: https://blog.51cto.com/u_14244765/5756418

相关文章

  • Python之父重回决策层,社区未来如何发展?
     春节假期结束了,大家陆续地重回到原来的生活轨道上。假期是一个很好的休息与调节的机会,同时,春节还有辞旧迎新的本意,它是新的轮回的开端。在Python社区里,刚发生了一件大事......
  • Python猫荐书系列之五:Python高性能编程
     稍微关心编程语言的使用趋势的人都知道,最近几年,国内最火的两种语言非Python与Go莫属,于是,隔三差五就会有人问:这两种语言谁更厉害/好找工作/高工资……对于编程语言的争......
  • 由浅入深:Python 中如何实现自动导入缺失的库?
    在写Python项目的时候,我们可能经常会遇到导入模块失败的错误:​​ImportError:Nomodulenamed'xxx'​​​或者​​ModuleNotFoundError:Nomodulenamed'xxx'​​......
  • python操作mysql
    安装第三方库pipinstallpymysql连接数据库案例1案例2插入数据时,需要commit提交方式2应用实例代码实现......
  • Python 进阶之源码分析:如何将一个类方法变为多个方法?
    前一篇文章《​​Python中如何实现参数化测试?​​》中,我提到了在Python中实现参数化测试的几个库,并留下一个问题:它们是如何做到把一个方法变成多个方法,并且将每个方法与......
  • Python 之父的解析器系列之七:PEG 解析器的元语法
    原题|​​AMeta-GrammarforPEGParsers​​作者|GuidovanRossum(Python之父)译者|豌豆花下猫(“Python猫”公众号作者)声明|本翻译是出于交流学习的目的,基于​​C......
  • Python 之父的解析器系列之三:生成一个 PEG 解析器
    原题|GeneratingaPEGParser作者|GuidovanRossum(Python之父)译者|豌豆花下猫(“Python猫”公众号作者)声明|本翻译是出于交流学习的目的,基于​​CCBY-NC-SA4.0......
  • Python基础篇:某宝一键秒杀,毫秒级的精准度
    某宝秒杀,用毫秒级的精准度来抢购! 还记得前段时间情人节,各种产品活动秒杀。结果自然少不了被对象一番折磨 (注意:不是new出来的哈,也不是橡胶的,实实在在的女朋友) 于是乎彻......
  • Python subProcess库以及Popen类的使用
    subprocess库是一个十分强大且常用的库,它可以用来调用第三方工具(例如:exe、另一个python文件、命令行工具)。1.常用函数call():执行由参数提供的命令,把数组作为参数运行命令......
  • Python中Try/Except/else/final语句
    python中的try/except/else/finally语句 与其他语言相同,在python中,try/except语句主要是用于处理程序正常执行过程中出现的一些异常情况,如语法错误(python作为脚本语言......