Google出品的Python代码静态类型分析器:Pytype

2019-05-02 16:10发布

Pytype检查并推断Python代码的类型——不需要类型注解。Pytype可以:

  • 使用lint检查纯Python代码,标记常见错误,如属性名拼写错误、不正确的函数调用,等等更多,它甚至可以跨文件。
  • 强化用户提供的类型注解。虽然注解对于pytype是可选的,但是当注解存在时,它会检查并应用们。
  • 在独立文件(“pyi文件”)中生成类型注解,可以使用自身提供的merge-pyi工具将其合并回Python源代码中。

Pytype是一个静态分析器,这意味着它不执行它所检查的代码。

谷歌的数千个项目都依赖pytype来保持其Python代码类型良好和无错误。

更多信息,请查看用户指南或FAQ。

快速入门

要快速开始对一个文件或目录进行类型检查,你只需运行以下命令,用你的输入替换file_or_directory :

要在整个包上设置pytype,请将以下内容添加到包上级目录中的setup.cfg文件中,用包名替换package_name:

现在,你可以运行无参数命令pytype来对包进行类型检查。将pytype添加到你的自动化测试中也很容易;参见在Travis上运行pytype的GitHub项目的示例。

最后,pytype会生成含有推断出的类型信息的文件,默认情况下位于.pytype/pyi中。你可以使用此信息对相应的源文件进行类型注解,用文件的导入路径替换module.py:

需求

你需要一个Python 2.7或3.5+解释器来运行pytype,还需要在$PATH中设置一个与所分析代码的Python版本相同的Python解释器。

平台支持:

  • Pytype目前是在Linux上开发和测试的,Linux是主要支持的平台。
  • 在MacOSX上安装需要OSX 10.7或更高版本,以及Xcode v8或更高版本。
  • 目前不支持windows。

安装

Pytype可以通过pip来安装。注意,安装过程需要使用wheel和setuptools。(如果你在virtualenv中工作,这两个包应该已经存在。)

或者从GitHub上的源码进行安装 :

代替使用--recurse-submodules参数进行安装, 你也可以在pytype目录中使用以下命令来安装:

用法

常见选项:

  • -V,--Python-Version:目标代码的Python版本(major.minor)。默认为3.6。
  • -o,--output:所有pytype输出的保存目录,包括生成的.pyi文件。默认为.pytype。
  • -d,--disable。以逗号分隔的要忽略的错误名称列表。pytype错误名称的详细说明在此文档中。默认为空。

要获得选项的完整列表,请运行pytype --help。

除了上面所述,你还可以通过设置$TYPESHED_HOME来直接运行pytype命令使用定制的typeshed安装替代它自己的绑定副本。

配置文件

为了方便起见,你可以将你的pytype配置保存在一个文件中。配置文件是一个带有[pytype]部分的INI-样式的文件;如果没有提供显式配置文件,pytype会从当前目录向上遍历查找第一个setup.cfg文件中的[pytype]部分。

我们从生成一个配置文件示例开始:

现在我们根据本地设置来自定义文件,只保留需要的部分。目录可能是配置文件的相对路径,如果你想将配置文件作为项目的一部分进行检查,这是非常有用的。

例如,假设你有以下目录结构,并且想要分析包 ~/repo1/foo,它依赖于包 ~/repo2/bar:

下面是设置好的配置文件,它将指示pytype将~/repo1/foo作为Python 3.6代码进行类型检查,在~/repo1和~/repo2中查找包,并忽略属性错误。注意,到包的路径不包括包本身。

我们可能会发现需要通过运行pytype的损坏依赖项检查器来将~/repo2添加到pythonpath中:

子工具

除了pytype本身外,Pytype还附带了三个脚本:

  • merge-pyi, 用于将.pyi文件中的类型信息合并到Python文件中.
  • pytd, 一个 .pyi 文件解析器.
  • pytype-single, pytype开发人员的调试工具,用来对单个Python文件进行分析,并假定已经为该Python文件的所有依赖项生成了.pyi文件。

产品路线图

•支持Windows系统

许可证

Apache 2.0

免责声明

本项目不是一个正式的Google产品。

英文原文:https://github.com/google/pytype 译者:一瞬
文章来源: https://www.toutiao.com/group/6686024727091216909/