跳转到主要内容

Python类型推断器

项目描述

CI PyPI - Wheel

pytype - 🦆✔

Pytype 检查并推断你的 Python 代码的类型 - 而无需要求类型注解。Pytype 可以

  • 检查纯 Python 代码,标记常见的错误,如拼写错误的属性名、不正确的函数调用等,甚至跨文件边界。
  • 强制执行用户提供的 类型注解。虽然对于 pytype 来说注解是可选的,但它会在存在时进行检查和应用。
  • 在独立文件中生成类型注解("pyi 文件"),这些文件可以与提供的 merge-pyi 工具合并回 Python 源代码。

Pytype 是一个静态分析器;它不会执行它运行的代码。

谷歌的成千上万个项目都依靠 pytype 来保持他们的 Python 代码具有良好的类型和错误-free。

有关更多信息,请参阅用户指南常见问题解答支持的功能

pytype 与其他类型检查器有何不同?

  1. Pytype 使用 推断 而不是渐进式类型。这意味着它会在代码上推断类型,即使代码上没有类型提示。因此,它可以检测出像这样的代码问题,而其他类型检查器可能会错过

    def f():
        return "PyCon"
    def g():
        return f() + 2019
    
    # pytype: line 4, in g: unsupported operand type(s) for +: 'str'
    # and 'int' [unsupported-operands]
    
  2. Pytype 是 宽容的 而不是严格的。这意味着它允许所有在运行时成功且不与注解冲突的操作。例如,此代码在 pytype 中将作为安全的通过,但在其他类型检查器中会失败,因为这些类型检查器在初始化变量时就会分配类型

    from typing import List
    def get_list() -> List[str]:
        lst = ["PyCon"]
        lst.append(2019)
        return [str(x) for x in lst]
    
    # mypy: line 4: error: Argument 1 to "append" of "list" has
    # incompatible type "int"; expected "str"
    

请参阅相应的 常见问题解答条目

快速入门

要快速开始检查文件或目录的类型,请运行以下命令,将 file_or_directory 替换为你的输入

pip install pytype
pytype file_or_directory

要为整个包设置 pytype,请将以下内容添加到包目录立即上面的 pyproject.toml 文件中,将 package_name 替换为包名

[tool.pytype]
inputs = ['package_name']

现在,你可以运行无参数命令 pytype 来检查包。它也很容易将 pytype 添加到你的自动化测试中;请参阅此 GitHub 项目示例,该示例在 GitHub Actions 上运行 pytype。

最后,pytype 会生成推断类型信息的文件,默认位置在 .pytype/pyi。你可以使用这些信息来为相应的源文件添加类型注解。

merge-pyi -i <filepath>.py .pytype/pyi/<filename>.pyi

要求

你需要 Python 3.8-3.12 解释器来运行 pytype,以及一个在 $PATH 中的解释器,用于分析你正在分析的代码的 Python 版本(支持:3.8-3.12)。

平台支持

  • Pytype 目前在 Linux* 上开发和测试,这是主要支持的平台。
  • 在 MacOSX 上安装需要 OSX 10.7 或更高版本以及 Xcode v8 或更高版本**。
  • 目前Windows不支持,除非您使用WSL

* 在Alpine Linux上,由于上游依赖问题,安装可能会失败。有关可能的修复方法,请参阅此问题的详细信息。
** 如果ninja依赖项安装失败,请确保已安装cmake。有关详细信息,请参阅此问题

安装

Pytype可以通过pip进行安装。请注意,安装需要wheelsetuptools。 (如果您在virtualenv中工作,这两个包应该已经存在。)

pip install pytype

或者从GitHub上的源代码获取

git clone --recurse-submodules https://github.com/google/pytype.git
cd pytype
pip install .

您也可以在pytype目录中运行以下命令,而不是使用--recurse-submodules

git submodule init
git submodule update

要编辑代码并实时跟踪您的更改,请将pip安装命令替换为以下命令:

pip install -e .

在WSL上安装

按照上述步骤进行,但请确保首先安装正确的库

sudo apt install build-essential python3-dev libpython3-dev

用法

usage: pytype [options] input [input ...]

positional arguments:
  input                 file or directory to process

常见选项

  • -V, --python-version:目标代码的Python版本(主要.次要)。默认为pytype运行的版本。
  • -o, --output:所有pytype输出都放入的目录,包括生成的.pyi文件。默认为.pytype
  • -d, --disable:逗号或空格分隔的错误名称列表,要忽略。pytype错误名称的详细说明见此文档。默认为空。

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

除了上述选项外,您还可以通过设置$TYPESHED_HOME,让pytype使用自定义typeshed安装而不是它自己的捆绑副本。

配置文件

为了方便,您可以将pytype配置保存在文件中。配置文件可以是具有[tool.pytype]部分(首选)的TOML样式文件,或具有[pytype]部分的INI样式文件。如果没有提供显式的配置文件,pytype将在从当前工作目录向上遍历的过程中查找第一个pyproject.tomlsetup.cfg文件中的pytype部分。

首先生成一个示例配置文件

$ pytype --generate-config pytype.toml

然后根据您的本地设置自定义文件,仅保留您需要的部分。目录可以相对于配置文件的路径,这对于您想将配置文件作为项目的一部分提交非常有用。

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

~/
├── repo1
│   └── foo
│       ├── __init__.py
│       └── file_to_check.py
└── repo2
    └── bar
        ├── __init__.py
        └── dependency.py

以下是填充后的配置文件,它指示pytype将~/repo1/foo作为Python 3.9代码进行分析,在~/repo1~/repo2中查找包,并忽略属性错误。请注意,包的路径不包括包本身。

$ cat ~/repo1/pytype.toml

# NOTE: All relative paths are relative to the location of this file.

[tool.pytype]

# Space-separated list of files or directories to process.
inputs = [
    'foo',
]

# Python version (major.minor) of the target code.
python_version = '3.9'

# Paths to source code directories, separated by ':'.
pythonpath = .:~/repo2

# Space-separated list of error names to ignore.
disable = [
    'attribute-error',
]

我们可以通过运行pytype的断依赖检查器发现,需要将~/repo2添加到pythonpath中

$ pytype --config=~/repo1/pytype.toml ~/repo1/foo/*.py --unresolved

Unresolved dependencies:
  bar.dependency

子工具

Pytype除了自身外,还附带了一些脚本

  • annotate-ast,AST的正在进行中的类型注解器。
  • merge-pyi,用于将类型信息从.pyi文件合并到Python文件中。
  • pytd-tool,.pyi文件的解析器。
  • pytype-single,pytype开发人员的调试工具,它分析单个Python文件,假设已经为其所有依赖项生成了.pyi文件。
  • pyxref,交叉引用生成器。

许可证

Apache 2.0

免责声明

这不是一个官方的Google产品。

项目详情


发布历史 发布通知 | RSS订阅

下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

pytype-2024.9.13.tar.gz (2.8 MB 查看散列值)

上传时间 源代码

构建分发

pytype-2024.9.13-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (4.7 MB 查看散列值)

上传时间 CPython 3.12 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

pytype-2024.9.13-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (4.7 MB 查看散列值)

上传时间 CPython 3.12 manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

pytype-2024.9.13-cp312-cp312-macosx_10_14_universal2.whl (4.7 MB 查看散列值)

上传时间 CPython 3.12 macOS 10.14+ universal2 (ARM64, x86-64)

pytype-2024.9.13-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (4.7 MB 查看散列值)

上传时间 CPython 3.11 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

pytype-2024.9.13-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (4.7 MB 查看散列值)

上传时间 CPython 3.11 manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

pytype-2024.9.13-cp311-cp311-macosx_10_14_universal2.whl (4.7 MB 查看散列值)

上传于 CPython 3.11 macOS 10.14+ universal2 (ARM64, x86-64)

pytype-2024.9.13-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (4.7 MB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

pytype-2024.9.13-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (4.7 MB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

pytype-2024.9.13-cp310-cp310-macosx_12_0_x86_64.whl (4.5 MB 查看哈希值)

上传于 CPython 3.10 macOS 12.0+ x86-64

pytype-2024.9.13-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (4.7 MB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

pytype-2024.9.13-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (4.7 MB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

pytype-2024.9.13-cp39-cp39-macosx_12_0_x86_64.whl (4.5 MB 查看哈希值)

上传于 CPython 3.9 macOS 12.0+ x86-64

pytype-2024.9.13-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (4.7 MB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

pytype-2024.9.13-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (4.7 MB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.27+ ARM64 manylinux: glibc 2.28+ ARM64

pytype-2024.9.13-cp38-cp38-macosx_12_0_x86_64.whl (4.5 MB 查看哈希值)

上传于 CPython 3.8 macOS 12.0+ x86-64

由以下支持