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.8-3.11 interpreter to run pytype, as well as an interpreter in $PATH for the Python version of the code you're analyzing (supported: 3.8-3.11).

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.

2023 Roadmap

  • Typegraph rewrite for improved correctness and performance.
  • Basic Python 3.11 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-2024.2.9.tar.gz (2.8 MB view details)

Uploaded Source

Built Distributions

pytype-2024.2.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

pytype-2024.2.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.3 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

pytype-2024.2.9-cp311-cp311-macosx_10_9_universal2.whl (4.3 MB view details)

Uploaded CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

pytype-2024.2.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

pytype-2024.2.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.3 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

pytype-2024.2.9-cp310-cp310-macosx_11_0_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

pytype-2024.2.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

pytype-2024.2.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.3 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

pytype-2024.2.9-cp39-cp39-macosx_11_0_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

pytype-2024.2.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

pytype-2024.2.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.3 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

pytype-2024.2.9-cp38-cp38-macosx_11_0_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.8 macOS 11.0+ x86-64

File details

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

File metadata

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

File hashes

Hashes for pytype-2024.2.9.tar.gz
Algorithm Hash digest
SHA256 493ade3bcbfe8e40f8a5e277574bfcb3f81dae759f1d3f0bf4f869898daacd80
MD5 b5bf02668c8122d5a3c4fe521650e97f
BLAKE2b-256 72ce52bd15e1118c9c4d019a07d085bb14f258ecef79ab819924e98fb680250b

See more details on using hashes here.

Provenance

File details

Details for the file pytype-2024.2.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pytype-2024.2.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a997db8f16962956c8dc868dd8ae6ec7f20be355f17a0ea26160d58972bc7ceb
MD5 d4494f61ce13cbf3a605a5c529a73ecc
BLAKE2b-256 003a906cb885a46148fc67840cb53c81ed022a5c1cdf8b48240c53413f5fd202

See more details on using hashes here.

Provenance

File details

Details for the file pytype-2024.2.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pytype-2024.2.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 01cf904ad882b3b2f0fb3e23b0f0d0d1258f13bd214e1a0714b3a2d54b0730a8
MD5 3a2efccbf38be5bdd59e9fa72ae2994f
BLAKE2b-256 a559e0e861ca9f15a364fec58fd6b7e87a526c49a16015065037a928ad006578

See more details on using hashes here.

Provenance

File details

Details for the file pytype-2024.2.9-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for pytype-2024.2.9-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 7bd3709eec4c932c106ab6177097be63d72b5df0502409fa6ba5885fcfe8d386
MD5 ec02ca1735c8915d6545643d27caef59
BLAKE2b-256 c99d3f25953982161ac721834dd8a90ac93eeae9bf474569e2278fab50a37e32

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2024.2.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1a5acec9897363841d17ff7865882e527ca7a9fcfe8bb9f537dfdb8ef099cafd
MD5 2fae96910f92b2ec3f7b40081b3420ec
BLAKE2b-256 e70e244024096852bcdf8394a79fc2268e19454c78c7f450de1653c41be95b4f

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2024.2.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 97624b671968f164fda77f3acd3e03e8c416c72002b680ec31856b4b51b3ae09
MD5 b5d3fc6d6711cd2ed22bf0115f052085
BLAKE2b-256 8d57c7b100f0bd2b616c68a4aad48ebfa64b573c9e759fbc4a915132bf1b5659

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2024.2.9-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 1b39ef490dbeec17f9fec19b191ac61a2f5336ef39fb272b5fc5f6236eebe21a
MD5 8f447888ee23ce33290c4e0843f97c51
BLAKE2b-256 a67ecf15ec042e63d3bfc81053216479cce0b8fa75fd83263eab521e7158e5b1

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2024.2.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a70f7005d05a1f3d7a141b4dd012923a7e85c3f0d6d9a1f2e03e543e87b87d6a
MD5 c6f7902a3f1c819f29b88ef8d4282a2a
BLAKE2b-256 21636a66d47e258de23498c849241f9ce4315273666a492c9bf99b01d52bce0d

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2024.2.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 56d5e27e6859511092791de6f22bfaadcde2e1b7b3dc50dfe0ccd7f17275d330
MD5 bff2c4d6bab10cad4158028c0dece61d
BLAKE2b-256 7774f7280205ae5338dd4f72498ab9a6e92e79ec9b27d4f25ac9aca3b5b80c1b

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2024.2.9-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 60e2f3e57a1e06143278dc2e5ec32dbfae896d1b1c1922d1be8e76501d2f7461
MD5 23d4a9a1a648c30b360f051ee06c960e
BLAKE2b-256 e6189da0e011c7f3507437002c219112a0874a679e303ca385cb033ef62362c0

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2024.2.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 33fb1b29abd8fd6f61ec8d69cf5077242a42fb727a726eedbbe382c4564115e6
MD5 89583b579548ee33291e150b1c186e7f
BLAKE2b-256 266c3415617a0e45421c3819d711a9780c2404500219e7b8af5496f781c520e7

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2024.2.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 095d03ff7546777d09ce17b1b2a1dd2625c38c28f166e5c64ebed78f817bca6a
MD5 1b4e594e6e7b67d5f65858464239bcc6
BLAKE2b-256 3f18a65dfc66336ef80276244e04ad6a743ed6c87ce46093cdb6be748c70fc1f

See more details on using hashes here.

Provenance

File details

Details for the file pytype-2024.2.9-cp38-cp38-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for pytype-2024.2.9-cp38-cp38-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 41a67549ad66a748794f6f422f7692f8aa3832e7080d4f442d67847e11c3b7ca
MD5 2168a760787c205e35e3a4ad4c5a50bf
BLAKE2b-256 64fbe4c0a138223905433fccb4201d38313a437658122b55de859a5b8ba194dd

See more details on using hashes here.

Provenance

Supported by

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