原文转载地址: https://mp.weixin.qq.com/s__biz=MzUyOTk2MTcwNg==&mid=2247484111&idx=1&sn=dde34ed721a990c26d98fdcb19e56363&chksm

近日,微软在 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://github.com/python/mypy

https://github.com/Microsoft/pyright

https://github.com/google/pytype

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

pyright是一个静态类型检查器。具体是怎么回事呢?今天番茄加速就来讲一下。 Python是一个动态语言,代码加载到内存并运行至某行时,变量类型才真正得以确定,如下,在运行至第2行前,编译器不知道 name 的类型为 str. before() name = ‘robot’ after() 毋庸置疑,python 这种语法,书写起来相当简洁,不用像 c++,java 等语言那样,必须声明类型。 看待任何事情都要用辩证思维,此处也不例外。简洁的语法,带来了一些副作用,下面用一个最简单的例子说明副作用。 Python是一门动态类型的语言,民间流传一种说法叫”动态一时爽,重构火葬场”,听起来够吓人的,好在这门语言在不断地改进,包括对 PEP484 引入的类型提示(Type ... Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。速度Pyright是一个针对大型Python源代码库的快速类型检查器。它可以在“监视(watch)”模式下运行,并在文件修改后执行快速增量更新。不依赖于Python环境Pyright不需要Python环境或导入安装的的第三方包。可配置性Pyright支持配置文件,它们可以通过设置来提供精细控制。不同的“执行... 利用 pyright 实现 MicroPython/Python 中文编程和中英互译 pyright 是微软开源的一个为 python 提供类型检查、自动补全、文档信息提示等语言服务的工具,用 typescript 写成,微软自家的 VS Code python 扩展 Pylance 就是基于 pyright 开发。 笔者在对 python 解释器进行中文化,实现草蟒中文编程语言之后,便打算对其小弟 micropython 进行中文化。但是,mpy 是针对单片机等小内存设备而实现的精简解释器,对 uft8 Pyright - 微软开源的Python语言的静态类型检查Python Speed Pyright 的静态类型检查器是一种用于大型 Python 源代码库的快速类型检查器。 它可以在“监视”模式下运行,并在修改文件时执行快速增量更新。 可配置性 Pyright 支持提供对设置的精细控制的配置文件。 不同的“执行环境”可以与源库中的子目录相关联。 每个环境可以指定不同的模块搜索路径、python 语言版本和平台目标。 类型检查功能 PEP 484 类型提示,包括泛型 PEP 526 变量注释语法 PEP 544 结构子类型 PEP 589 类型字典 PEP 591 最终限定符 PEP 593 灵活变量注释 PEP 604 联合的补充语法 PEP 612 参数规范类型别名 PEP 613 类型引用用于函数返回值、实例变量、类变量和全局变量类型保护,可以理解条件代码流结构,如 if/else 语句 VS 代码集成 Pyright 作为命令行工具和 VS Code 扩展提供,提供许多强大的功能,有助于提高编程效率。 VS Code 语言功能 VS Code 扩展支持许多节省时 近日,微软在 Github 上开源了一个 Python 静态类型检查工具pyright ,引起了社区内的多方关注。 微软在开源项目上的参与力度是越来越大了,不说收购 Github 这种大的战略野心,只说它家开源的 VS Code 编辑器,在猿界已经割粉无数,连我们 Python 圈的红人 Kenneth Reitz (多个开源项目的作者,包括 requests、requests-html、res... 参加 2019 Python开发者日,请扫码咨询 ↑↑↑来源 | GitHub编辑 | suiling出品|Python大本营(ID:pythonnews)近日,微软...     windows 下编写控制台程序后,会生成exe的可执行程序,创建工程最后都会生成可执行程序,python工程都是python调用各种模块,执行起来也不方便,所以这里讲一下python封装exe文件过程!windows 系统(按照我自己环境):    首先我们拿到python工程文件后,必须保证程序可以正常执行,才能在此环境中进行封装,不然封装成功了,执行时会报错,提示有些模块没有导入  ... Static type checker for PythonSpeedPyright is a fast type checker meant for large Python source bases. It can run in a “watch” mode and performs fast incremental updates when files are modified.Config... 这一阵在公司内部写一个小项目,逻辑不复杂,但数据类型正确非常重要。最开始因为内网中的 vscode 版本太低,只开了最基本的 Python 插件。 后来因为 vscode 版本升级,我便启用了 pyright 插件,打开后 vscode 满眼红色波浪线,仔细查看报错原因,很多报错都是我没有处理返回值 None 导致的,最后我修复了至少4个隐藏 bug。 经过几次使用,我觉得类型提示是 Python... 近日,开发者msfterictraut在GitHub上提交了一个名为Pyrignt的开源项目,这是一个Python的静态类型检查器,主要是为了解决mypy等现有的Python类型检查器无法解决的问题。\nPyright的编写语言是TypeScript,可在节点内运行,适用于大型Python源代码库,不需要安装Python环境或导入的第三方软件包,在与VS Code编辑器一起使用时,使用节点作为其扩... (给机器学习算法与Python学习加星标,提升AI技能)来源:开源中国(ID:oschina2013)微软宣布推出一种新的 Python 语言服务器,名为 Pylance,其可利用语言服... cookie是什么? cookie是浏览器访问服务器后,服务器会返给浏览器的一段数据。浏览器会保存这段数据。当浏览器再次访问服务器时,浏览器会自动带上这段cookie。 cookie有有效期吗? 有。默认20分钟,但是后端可以设置。设置方法可以看mdn相关知识。 cookie怎么作假? 浏览器f12有cookie,手动作假。但是服务器可以设置js不能修改cookie。