介绍

近日,微软在 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,类型检查的规范逐渐丰富。

类型检查的好处是及早检查,提前发现类型的错误,增强代码的一致性与可维护性。(还有防止脱发,喵)

 
  1. # 不加检查
  2. def greeting(name):
  3.     return 'Hello ' + name
  4. # 添加检查
  5. def greeting(name: str) -> str:
  6.     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相关推荐

  1. python 类型检查工具_pyre check-用于符合PEP 484的Python的高性能类型检查器

    Pyre是用于符合PEP 484的Python的高性能类型检查器.Pyre可以逐步分析具有数百万行代码的代码库-在开发人员编写代码时向他们提供即时反馈. Pyre随附了Pysa,Pysa是我们在Pyr ...

  2. Flow - JS静态类型检查工具

    本章的目标是提供一些Flow工具的介绍与使用建议.Flow本质上也只是个检查工具,它并不会自动修正代码中的错误,也不会强制说你没按照它的警告消息修正,就不会让你运行程序.当然,并没有要求什么时候一定要 ...

  3. 浅谈 TypeScript【上】-- Flow 静态类型检查工具

    文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在[编程语言分类]中,我介绍到JavaScript是一种类型不安全语言,没有明确的数据类型声明,变量的类型可以随意的更改.为了解决这种问题,微软开发 ...

  4. python类型检查_python【数据类型检查】

    [数据类型检查] 在实际接口自动化测试过程中,我们会发现接口的很多入参参数都标记了[string.int.float.array等等 ],这就迫使我们对入参得作下检查工作,不然运行完成后,出错了,代码 ...

  5. 防劫持工具,介绍几款浏览器劫持修复工具

    相信很多人都会自己设定浏览器的主页,但是有时候,我们会发现打开自己浏览器设置好的主页,结果被莫名其妙的跳转到其他的网址,这种情况大多是浏览器劫持.遇到这种情况,即使锁定主页也没法解决,我们可以借助浏览 ...

  6. 两款C++静态检查工具

    pclint(收费) pc-lint是资格最老,最强力的代码检查工具,但是是收费软件,并且配置起来有一点点麻烦. ccpchecker http://cppcheck.net/ CppCheck 是免 ...

  7. 介绍一款 API 敏捷开发工具

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:棒锤 xie.infoq.cn/article/b5 ...

  8. 介绍一款 API 敏捷开发工具,告别加班!

    作者:棒锤 来源:xie.infoq.cn/article/b5c3a339267e1351c6151b42a_ 初衷 用尽可能简单的方式,完成尽可能多的需求.通过约定的方式 实现统一的标准.告别加班 ...

  9. 介绍一款facebook信息收集工具FBI

    为什么80%的码农都做不了架构师?>>>    概述 作为一个工具党,收集一些工具肯定是少不了的,今天介绍的是一款facebook的信息收集工具叫fbi,虽然对国内用户用处不大,哈哈 ...

最新文章

  1. 数值分区间_EXCEL统计区间个数的专属函数
  2. STE:中科院微生物所胡松年组揭示一年内医院ICU环境菌群的生物多样性
  3. centos 调整系统时间
  4. 图片底下配的文字叫什么_38岁孙俪越来越有女人味!穿短裙配性感黑丝美腿撩人,短发超美...
  5. linux 关闭redis 命令_redis----------linux和mac如何安装redis和启动,关闭
  6. php stripos 返回值,php函数stripos详解
  7. vc++ mfc中拖动效果的实现 借助于CImageList
  8. js控制图像等比例缩放
  9. Spring mvc 文件上传
  10. background的认识(二)
  11. wordpress中如何正确书写robots.txt
  12. linux实验考试题
  13. 传感器实验——LCD显示SHT20
  14. python画出分子化学空间分布(UMAP)
  15. java调用万网域名接口
  16. Python实现批量自动发工资条
  17. 【微信小程序】 map 组件 callout 自定义气泡 (实实在在的讲解)
  18. WinRAR命令行用法
  19. BIM家装族库丨艺术家具族
  20. PHP面试总结 v2018.08.24

热门文章

  1. TTL expired in transit--问题篇~
  2. NA-NP-IE系列实验5:配置文件的备份和IOS 的备份
  3. 甲骨文严查Java授权,企业连夜删除JDK
  4. .NET6之MiniAPI(五):选项
  5. switch类型模式
  6. .NET 6 新特性 —— Random.Shared
  7. NET问答: 多个 await 和 Task.WaitAll 是等价的吗?
  8. .NET WebSocket 核心原理初体验
  9. Dotnet中Span, Memory和ReadOnlySequence之浅见
  10. EntityFramework Core 5.0 VS SQLBulkCopy