Skip to main content

Python type inferencer

Project description

CI PyPI - Wheel

pytype - 🦆✔

Pytype checks and infers types for your Python code - without requiring type annotations. Pytype can:

  • Lint plain Python code, flagging common mistakes such as misspelled attribute names, incorrect function calls, and much more, even across file boundaries.
  • Enforce user-provided type annotations. While annotations are optional for pytype, it will check and apply them where present.
  • Generate type annotations in standalone files ("pyi files"), which can be merged back into the Python source with a provided merge-pyi tool.

Pytype is a static analyzer; it does not execute the code it runs on.

Thousands of projects at Google rely on pytype to keep their Python code well-typed and error-free.

For more information, check out the user guide, FAQ, or supported features.

How is pytype different from other type checkers?

  1. Pytype uses inference instead of gradual typing. This means it will infer types on code even when the code has no type hints on it. So it can detect issues with code like this, which other type checkers would miss:

    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 is lenient instead of strict. That means it allows all operations that succeed at runtime and don't contradict annotations. For instance, this code will pass as safe in pytype, but fail in other type checkers, which assign types to variables as soon as they are initialized:

    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"
    

Also see the corresponding FAQ entry.

Quickstart

To quickly get started with type-checking a file or directory, run the following, replacing file_or_directory with your input:

pip install pytype
pytype file_or_directory

To set up pytype on an entire package, add the following to a pyproject.toml file in the directory immediately above the package, replacing package_name with the package name:

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

Now you can run the no-argument command pytype to type-check the package. It's also easy to add pytype to your automated testing; see this example of a GitHub project that runs pytype on GitHub Actions.

Finally, pytype generates files of inferred type information, located by default in .pytype/pyi. You can use this information to type-annotate the corresponding source file:

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

Requirements

You need a Python 3.7-3.10 interpreter to run pytype, as well as an interpreter in $PATH for the Python version of the code you're analyzing (supported: 3.7-3.10).

Platform support:

  • Pytype is currently developed and tested on Linux*, which is the main supported platform.
  • Installation on MacOSX requires OSX 10.7 or higher and Xcode v8 or higher**.
  • Windows is currently not supported unless you use WSL.

* On Alpine Linux, installation may fail due to issues with upstream dependencies. See the details of this issue for a possible fix.
** If the ninja dependency fails to install, make sure cmake is installed. See this issue for details.

Installing

Pytype can be installed via pip. Note that the installation requires wheel and setuptools. (If you're working in a virtualenv, these two packages should already be present.)

pip install pytype

Or from the source code on GitHub.

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

Instead of using --recurse-submodules, you could also have run

git submodule init
git submodule update

in the pytype directory. To edit the code and have your edits tracked live, replace the pip install command with:

pip install -e .

Installing on WSL

Follow the steps above, but make sure you have the correct libraries first:

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

Usage

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

positional arguments:
  input                 file or directory to process

Common options:

  • -V, --python-version: Python version (major.minor) of the target code. Defaults to the version that pytype is running under.
  • -o, --output: The directory into which all pytype output goes, including generated .pyi files. Defaults to .pytype.
  • -d, --disable. Comma or space-separated list of error names to ignore. Detailed explanations of pytype's error names are in this doc. Defaults to empty.

For a full list of options, run pytype --help.

In addition to the above, you can direct pytype to use a custom typeshed installation instead of its own bundled copy by setting $TYPESHED_HOME.

Config File

For convenience, you can save your pytype configuration in a file. The config file can be a TOML-style file with a [tool.pytype] section (preferred) or an INI-style file with a [pytype] section. If an explicit config file is not supplied, pytype will look for a pytype section in the first pyproject.toml or setup.cfg file found by walking upwards from the current working directory.

Start off by generating a sample config file:

$ pytype --generate-config pytype.toml

Now customize the file based on your local setup, keeping only the sections you need. Directories may be relative to the location of the config file, which is useful if you want to check in the config file as part of your project.

For example, suppose you have the following directory structure and want to analyze package ~/repo1/foo, which depends on package ~/repo2/bar:

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

Here is the filled-in config file, which instructs pytype to type-check ~/repo1/foo as Python 3.9 code, look for packages in ~/repo1 and ~/repo2, and ignore attribute errors. Notice that the path to a package does not include the package itself.

$ 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',
]

We could've discovered that ~/repo2 needed to be added to the pythonpath by running pytype's broken dependency checker:

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

Unresolved dependencies:
  bar.dependency

Subtools

Pytype ships with a few scripts in addition to pytype itself:

  • annotate-ast, an in-progress type annotator for ASTs.
  • merge-pyi, for merging type information from a .pyi file into a Python file.
  • pytd-tool, a parser for .pyi files.
  • pytype-single, a debugging tool for pytype developers, which analyzes a single Python file assuming that .pyi files have already been generated for all of its dependencies.
  • pyxref, a cross-references generator.

2022 Roadmap

  • Complete Python 3.9 feature support.
  • Basic Python 3.10 support.

License

Apache 2.0

Disclaimer

This is not an official Google product.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytype-2023.3.13.tar.gz (2.9 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pytype-2023.3.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

pytype-2023.3.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

pytype-2023.3.13-cp310-cp310-macosx_11_0_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

pytype-2023.3.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

pytype-2023.3.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.8 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

pytype-2023.3.13-cp39-cp39-macosx_11_0_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.9macOS 11.0+ x86-64

pytype-2023.3.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

pytype-2023.3.13-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.8 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

pytype-2023.3.13-cp38-cp38-macosx_10_15_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.8macOS 10.15+ x86-64

pytype-2023.3.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

pytype-2023.3.13-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.8 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

pytype-2023.3.13-cp37-cp37m-macosx_10_15_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.7mmacOS 10.15+ x86-64

File details

Details for the file pytype-2023.3.13.tar.gz.

File metadata

  • Download URL: pytype-2023.3.13.tar.gz
  • Upload date:
  • Size: 2.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.9

File hashes

Hashes for pytype-2023.3.13.tar.gz
Algorithm Hash digest
SHA256 4be9e3726ee4c23a5685f96b2146a32e416fdb9c3c67e950f3d1d1512f8f9544
MD5 4d7c13e61c1e02ea56fa120f813791d7
BLAKE2b-256 99dfa0d13719e0be1a29f005917ca1f56e0ec42bb45e359de72e4bb7847e0b1c

See more details on using hashes here.

File details

Details for the file pytype-2023.3.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pytype-2023.3.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ed880487013e96aa5ef8550d0ace0d801774204ce6d0f19df7557ce3bb184b72
MD5 bfede11edece5e63f709331065e0fe34
BLAKE2b-256 5a640c81578d1028cce7c95ece8ce915626845d501d26b0a0e0dd1cef6d9290c

See more details on using hashes here.

File details

Details for the file pytype-2023.3.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pytype-2023.3.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 574b278431abab5473ab2ab6468dae0a20a6b07f54f101b6600de686e3b5d64b
MD5 bed01fb4c4d211549146d8e3b7ded204
BLAKE2b-256 5cfa11c4fe1e93cd75b1057b273e5f5ca5bec700684f2806e1bece349c7e8565

See more details on using hashes here.

File details

Details for the file pytype-2023.3.13-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pytype-2023.3.13-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 9787f3596b624c1ecd0b155ca4e96d413287bfd0d74db24d0964d1a9a5db2cd4
MD5 af67aea76a296257040dc54967535884
BLAKE2b-256 4a849ea1e72d3860e1ea30b040eb7a77a80455631d0d1fb251908037eca969b3

See more details on using hashes here.

File details

Details for the file pytype-2023.3.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pytype-2023.3.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 03599998a6e1e214f7df5f5eb3cfbeb8785d924db5f88c81c9e9ebe6ebe401b9
MD5 2ae6b9829c73983ee18094185f3277c6
BLAKE2b-256 704be4bbd211b295eeb12d81b4b99de6de48949590eb28be3ca4b16df9c45c37

See more details on using hashes here.

File details

Details for the file pytype-2023.3.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pytype-2023.3.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 76eb66f1d9b904a432d17b94a3df711f684616e9934302323d8950746535bcb2
MD5 42859b5ecb6f23a48427446f6def0ddc
BLAKE2b-256 427df87840bf629579a57b6932bd89b06244cbd243bb9d012c93446c5228ce7e

See more details on using hashes here.

File details

Details for the file pytype-2023.3.13-cp39-cp39-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pytype-2023.3.13-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 606fe4963dcb71d799b71d4398969d2bd307c0c0cc54307fd13fb5b79d9188e2
MD5 f0bdb4861f72ac9f42898bbb483a12b4
BLAKE2b-256 a36fe42fde235ec8957d7b410c6d73af5599ef7e22657023f9b1b6ba983a3748

See more details on using hashes here.

File details

Details for the file pytype-2023.3.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pytype-2023.3.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 20d93c9547796160bb90119e76547b97687e77b3f56b8b19441ab0f302da45d5
MD5 deca85fd92af96e5c6845982e0328ec0
BLAKE2b-256 f2d4035939be06e38b4f258d4f6cc8c9efa8917960bc103edb175f0c4d940937

See more details on using hashes here.

File details

Details for the file pytype-2023.3.13-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pytype-2023.3.13-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 695669d003c3ae26a9a94411f824d359c14e9908ad28809ffbe633807973d99a
MD5 2185ce8673c3d7cf658239598f2cb016
BLAKE2b-256 41d62854728fa3e9b1b45b76c6e0733efb3de7adc88b505b91dbc32b17d7f78b

See more details on using hashes here.

File details

Details for the file pytype-2023.3.13-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for pytype-2023.3.13-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 78166725330297bb9965d1bce3730c4650fe1323fbc197303156e2dcbf5bcb07
MD5 cf184ddfad2f588253442704ba4d9e41
BLAKE2b-256 0b9f35026ed1bef52d0f513389248d5e98db01585d733cc44e6fe1660a196fbb

See more details on using hashes here.

File details

Details for the file pytype-2023.3.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pytype-2023.3.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b7d9b1cb7a14d673239eae2a7f3a105eb274c506d73b89ea4f30764860bf1a92
MD5 36c1d78ee3b4f55a0598a3c1b03b5f10
BLAKE2b-256 5c7c96b24caa459737ae213d6751ee7dd4485e5d66f282c9718fdc9f7ae97eb3

See more details on using hashes here.

File details

Details for the file pytype-2023.3.13-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pytype-2023.3.13-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9cade24e1d6ab75e8599f0f01a03f29858488437cdc7774450ac06c291e534d5
MD5 5fd3ad06ddf8c52a0e8b461121123f04
BLAKE2b-256 b5676272e2ca035ff3cf5d7dd0e6c1a90b34de637ca3c06b94f4fac857008348

See more details on using hashes here.

File details

Details for the file pytype-2023.3.13-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for pytype-2023.3.13-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 962f0624697584b90d7b28fc303034f5ad9971b5393cc6d951ebf5b9c4a6a01f
MD5 512f0535176631d04b38c015b8f858ac
BLAKE2b-256 347291a51e27a77d13fadcea8214bd0dd90ce57430416a8d879fd37f0e7c5dfb

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page