介绍一款python类型检查工具pyright
介绍
近日,微软在 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 倍呢?感兴趣的同学们可以去试试。有什么使用体会,欢迎留言与我交流。
使用限制
Pyright目前仅提供对Python 3.0及更高版本的支持,且目前没有支持旧版本的计划。
FAQ
Q:Pyright和Microsoft Python VS Code插件有什么区别?
A:Python VS Code插件是VS Code的官方Python支持扩展。 它由Microsoft的工程师团队提供官方支持。 它支持各种功能,包括调试、linter插件、类型检查插件等等。 Pyright完全专注于类型检查。 这是一个没有专门团队的次要项目。
Q:Pyright和Microsoft Python语言服务器有什么区别?
A:Microsoft Python语言服务器是一种语言服务器协议(LSP)实现,可以和Microsoft Python VS Code插件配合使用,并由Microsoft工程师团队提供官方支持。 它还提供类型检查功能。 Pyright提供了与之重复的功能,但包括了一些独特的功能,如可配置性更高、命令行执行和更好的性能。
安装
你可以直接从VS Code安装最新发布的Pyright VS Code扩展版本。只需打开扩展程序面板并搜索 pyright 即可。
最新版本的命令行工具可以使用npm命令: npm i pyright 进行安装
全局安装:npm i -g pyright
运行命令行工具:npx pyright <options>
构建说明
要构建项目,请注意以下事项:
安装nodejs
在克隆源的主目录中打开终端窗口
执行 npm run install:all 来安装依赖项
执行 npm run build
构建VS Code扩展包,请注意以下事项:
步骤与以上部分相同,但是需要再加一个步骤:
执行 npm run package
生成的包(pyright-X.Y.Z.vsix)可以在客户端目录中找到。如需在VS Code中安装,请转到扩展面板,然后从菜单中选择“从VSIX安装...”,然后选择对应的包即可。
项目地址:
https://github.com/python/mypy
https://github.com/Microsoft/pyright
https://github.com/google/pytype
https://github.com/facebook/pyre-check
参考:
http://t.cn/EiQWiGD
http://3g.163.com/dy/article/EB50P5GI0511DPVD.html
介绍一款python类型检查工具pyright相关推荐
- python 类型检查工具_pyre check-用于符合PEP 484的Python的高性能类型检查器
Pyre是用于符合PEP 484的Python的高性能类型检查器.Pyre可以逐步分析具有数百万行代码的代码库-在开发人员编写代码时向他们提供即时反馈. Pyre随附了Pysa,Pysa是我们在Pyr ...
- Flow - JS静态类型检查工具
本章的目标是提供一些Flow工具的介绍与使用建议.Flow本质上也只是个检查工具,它并不会自动修正代码中的错误,也不会强制说你没按照它的警告消息修正,就不会让你运行程序.当然,并没有要求什么时候一定要 ...
- 浅谈 TypeScript【上】-- Flow 静态类型检查工具
文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在[编程语言分类]中,我介绍到JavaScript是一种类型不安全语言,没有明确的数据类型声明,变量的类型可以随意的更改.为了解决这种问题,微软开发 ...
- python类型检查_python【数据类型检查】
[数据类型检查] 在实际接口自动化测试过程中,我们会发现接口的很多入参参数都标记了[string.int.float.array等等 ],这就迫使我们对入参得作下检查工作,不然运行完成后,出错了,代码 ...
- 防劫持工具,介绍几款浏览器劫持修复工具
相信很多人都会自己设定浏览器的主页,但是有时候,我们会发现打开自己浏览器设置好的主页,结果被莫名其妙的跳转到其他的网址,这种情况大多是浏览器劫持.遇到这种情况,即使锁定主页也没法解决,我们可以借助浏览 ...
- 两款C++静态检查工具
pclint(收费) pc-lint是资格最老,最强力的代码检查工具,但是是收费软件,并且配置起来有一点点麻烦. ccpchecker http://cppcheck.net/ CppCheck 是免 ...
- 介绍一款 API 敏捷开发工具
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:棒锤 xie.infoq.cn/article/b5 ...
- 介绍一款 API 敏捷开发工具,告别加班!
作者:棒锤 来源:xie.infoq.cn/article/b5c3a339267e1351c6151b42a_ 初衷 用尽可能简单的方式,完成尽可能多的需求.通过约定的方式 实现统一的标准.告别加班 ...
- 介绍一款facebook信息收集工具FBI
为什么80%的码农都做不了架构师?>>> 概述 作为一个工具党,收集一些工具肯定是少不了的,今天介绍的是一款facebook的信息收集工具叫fbi,虽然对国内用户用处不大,哈哈 ...
最新文章
- 数值分区间_EXCEL统计区间个数的专属函数
- STE:中科院微生物所胡松年组揭示一年内医院ICU环境菌群的生物多样性
- centos 调整系统时间
- 图片底下配的文字叫什么_38岁孙俪越来越有女人味!穿短裙配性感黑丝美腿撩人,短发超美...
- linux 关闭redis 命令_redis----------linux和mac如何安装redis和启动,关闭
- php stripos 返回值,php函数stripos详解
- vc++ mfc中拖动效果的实现 借助于CImageList
- js控制图像等比例缩放
- Spring mvc 文件上传
- background的认识(二)
- wordpress中如何正确书写robots.txt
- linux实验考试题
- 传感器实验——LCD显示SHT20
- python画出分子化学空间分布(UMAP)
- java调用万网域名接口
- Python实现批量自动发工资条
- 【微信小程序】 map 组件 callout 自定义气泡 (实实在在的讲解)
- WinRAR命令行用法
- BIM家装族库丨艺术家具族
- PHP面试总结 v2018.08.24
热门文章
- TTL expired in transit--问题篇~
- NA-NP-IE系列实验5:配置文件的备份和IOS 的备份
- 甲骨文严查Java授权,企业连夜删除JDK
- .NET6之MiniAPI(五):选项
- switch类型模式
- .NET 6 新特性 —— Random.Shared
- NET问答: 多个 await 和 Task.WaitAll 是等价的吗?
- .NET WebSocket 核心原理初体验
- Dotnet中Span, Memory和ReadOnlySequence之浅见
- EntityFramework Core 5.0 VS SQLBulkCopy