Python类型推断器
项目描述
pytype - 🦆✔
Pytype 检查并推断你的 Python 代码的类型 - 而无需要求类型注解。Pytype 可以
- 检查纯 Python 代码,标记常见的错误,如拼写错误的属性名、不正确的函数调用等,甚至跨文件边界。
- 强制执行用户提供的 类型注解。虽然对于 pytype 来说注解是可选的,但它会在存在时进行检查和应用。
- 在独立文件中生成类型注解("pyi 文件"),这些文件可以与提供的 merge-pyi 工具合并回 Python 源代码。
Pytype 是一个静态分析器;它不会执行它运行的代码。
谷歌的成千上万个项目都依靠 pytype 来保持他们的 Python 代码具有良好的类型和错误-free。
pytype 与其他类型检查器有何不同?
-
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]
-
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进行安装。请注意,安装需要wheel
和setuptools
。 (如果您在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.toml
或setup.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
,交叉引用生成器。
许可证
免责声明
这不是一个官方的Google产品。
项目详情
哈希值 用于 pytype-2024.9.13-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7bdaf1eaaf17a13741f67686c2d4c94c30279cd682c7e4cf535e41fc911b0e59 |
|
MD5 | 0145abb7be2d30851e9ed9ab894af913 |
|
BLAKE2b-256 | 8b3300a8c02d04955014de2d31db1da100e1c160d14082201d066287ba3812bc |
哈希值 用于 pytype-2024.9.13-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 176a5bbc0cb0882918a0b48818b95df2c15811e3a8391da089ffc5b33fea7013 |
|
MD5 | 685b568400baf289249648b8bf3c712a |
|
BLAKE2b-256 | 5d5a006b2fd2191393b180f86b8fb017863d496c33f4bf91808e823476be1ff9 |
哈希值 用于 pytype-2024.9.13-cp312-cp312-macosx_10_14_universal2.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 53b767d85f374c7483c8b2849dceb811a15fcb01520e245dd82bd7c0e2befefb |
|
MD5 | f9a2348c00a6c7dbab15a620d3bf986f |
|
BLAKE2b-256 | 88acceedd78eb9c68b8121f7b7688674d9cfe2cd59d051cd46adf5a776770617 |
哈希值 用于 pytype-2024.9.13-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | eb9eaaaf6c33e2716fdce1cf4166d3e5099372d8898b69ab7673225928096456 |
|
MD5 | 5193e871c3a9d105b7573429a5ea6f90 |
|
BLAKE2b-256 | 929eb7caca3d644ff56c8219108d1e7c07587f61005460fb628908355eedaa2a |
哈希值 用于 pytype-2024.9.13-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1b530eae5ab421a2dc9c4ef53f68629c5a622545150ae9702dbb811f56852a63 |
|
MD5 | c35e1c08159b5ad9ca84e2fde3b625c3 |
|
BLAKE2b-256 | 40aef47f47a0361e398ed4e85acd0d35670480d6e571bde710830e736fc99ad2 |
哈希值 用于 pytype-2024.9.13-cp311-cp311-macosx_10_14_universal2.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 38f3eddf05d8530ef16d3d7c2da2556148b9975fc7c3405ac3073022e1a7434b |
|
MD5 | 79182562b384ac1937a5e90efe320471 |
|
BLAKE2b-256 | fb1e074adcea2f970bb15973ab0768496fdffc8135b78b975d62733042dc9706 |
哈希值 用于 pytype-2024.9.13-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 529f19141c6170d96a38909df430ca52e6904eaef851ad2690cf632f17d2c195 |
|
MD5 | d0b7dc0dc2e86d05db7f4aefb323fdcf |
|
BLAKE2b-256 | 7e023695363527016e721c322db266fb239362cbbb9579014c15ea82a99c3108 |
哈希值 用于 pytype-2024.9.13-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2d5dc847c2fe98bac044f956e2fc9f074f09704b64436522b81ede7dd5fa3653 |
|
MD5 | e2745678cecff6faa14514a400397521 |
|
BLAKE2b-256 | 8eb116bf1111b3cd99ab59be97edf5a8724342daba8d6b18bf95b5b2cb271c50 |
哈希值 用于 pytype-2024.9.13-cp310-cp310-macosx_12_0_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 52c0005d220b27f9c933e4077de700c4e8171abce0c2af72f4c6263a85ff5bce |
|
MD5 | ab1fb888c21b3eb99862319d77912073 |
|
BLAKE2b-256 | 8710b31b73d9ba4e32d350f9a6d4e4b1fce142eaab62f97dbd58ee9c4f906b09 |
哈希值 用于 pytype-2024.9.13-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9df731062dc18518a46135c4825ad966e1a275ffc0723dd62f9771b420889da0 |
|
MD5 | 3eabc4e98aae3a204f90be9f02ed1b28 |
|
BLAKE2b-256 | 57fcdac9007a3f7779aa20120683e89c64ebdc2a089528425d1ae40a003cbae0 |
哈希值 用于 pytype-2024.9.13-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8dcfd509118c2d7e0787e72832b45e30037af1c29dfcb733a7e8014f58337287 |
|
MD5 | e6900fd3c0de233ade95ebe79e0e1c24 |
|
BLAKE2b-256 | 58fdf9fac9a73400cb37400cce565b61a82d33424ea83c882e9ffa49a536539a |
哈希值 用于 pytype-2024.9.13-cp39-cp39-macosx_12_0_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b5fdc24b60938ee846dfbdf08b5ea96e934e7d69c34eb1f8fb7707083d177f0e |
|
MD5 | 6a9f07f65d6c2cf61488d52e33abe6f5 |
|
BLAKE2b-256 | 674f43f5ba4cbdd172cc21a7d58e25e34263dc59ee44e10d6acc993855277016 |
哈希值 for pytype-2024.9.13-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b9b40beab6ef04fc260d86a8ef47b25d1b525dbc4cfbcb73151fd74210c176df |
|
MD5 | 3d21cec0314eab040565133bc2d8cded |
|
BLAKE2b-256 | f6237abf2ede7396fb4b9fc2232623b7fe5d69af8e0e6ea28fbb3ec82a1c092b |
哈希值 for pytype-2024.9.13-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6e500727967b843488c1978114778162ef00fee9be49dfa5b4758dcbbcc55dd9 |
|
MD5 | 4df27b0ca7746de85332739a6d9162fe |
|
BLAKE2b-256 | 2c0f46b8a19a38dfd324ff201c347c1327dc09a513d1c0f85a8c8a7aa23268f5 |
哈希值 for pytype-2024.9.13-cp38-cp38-macosx_12_0_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 425011cc45fba8c83af796155049f9db89d11e8aedbfb21bc1c99408f4a2c4e3 |
|
MD5 | 1bfd3ebf02075ad012db8769bbdd6e75 |
|
BLAKE2b-256 | beb3345b20ab02e5c0396e427842cf27d70c4a629b862e9da6d14ecfc590d413 |