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-2023.10.17.tar.gz (2.5 MB view details)

Uploaded Source

Built Distributions

pytype-2023.10.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

pytype-2023.10.17-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

pytype-2023.10.17-cp311-cp311-macosx_10_9_universal2.whl (4.2 MB view details)

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

pytype-2023.10.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

pytype-2023.10.17-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

pytype-2023.10.17-cp310-cp310-macosx_11_0_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

pytype-2023.10.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

pytype-2023.10.17-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

pytype-2023.10.17-cp39-cp39-macosx_11_0_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

pytype-2023.10.17-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

pytype-2023.10.17-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

pytype-2023.10.17-cp38-cp38-macosx_11_0_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.8 macOS 11.0+ x86-64

File details

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

File metadata

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

File hashes

Hashes for pytype-2023.10.17.tar.gz
Algorithm Hash digest
SHA256 e94151428769bccd2410b7407edd84fb383c1bbe26f4925906d214a4c3853ca7
MD5 a67dbd0deea825c0283178b81814923f
BLAKE2b-256 ebe96305542454e17fc1aff533615fa8ca634a9534ee737d1cbde5a4fdf5e6a0

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.10.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7f931503dbcbaa47c5c81a9015dfd255b418961bc23735141fe1b0d9bad23e19
MD5 1eac283897608d02911c661eaf0f50ca
BLAKE2b-256 a087b2cc4564b6f06ac050bbec83b7edbb62a682f900f65aaf7e0700f3c48643

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.10.17-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2f9c9f48aa6ca52a373f2a95cc46d0926bd22d04eba0d935fbffa52097f89e95
MD5 404538bcc3e91740f6ef7ff1b6fd4787
BLAKE2b-256 6c8147155fdba06fdb7c922583325c37b2899335e9d1229dd9722fac80a5f682

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.10.17-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 c771d8bd6904ed41f92b38ff074117f39b023eef80719f7bb4f20336029bd40a
MD5 5210064c3f6b542335151e587e0bdc84
BLAKE2b-256 a494cd6b2953d7dc0471646b14dc4a6830356aed39004a73a5d5323313a2e648

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.10.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dbdfa4160d8e25e034c91a314005198140d4ff4aea32744bd23731c99a028ef0
MD5 d4d55bd32016ad814b85735aac19fc90
BLAKE2b-256 2d4fd93b124f0731744676d0f99227e592a4cacbddd757be039e945feeda4168

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.10.17-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 62f9c66598dc28341c06930c5fb34937ea953a9c423f2b1d806bcfd70cf4b2c9
MD5 12573e9ba8d63e056e46e65ab87e466f
BLAKE2b-256 dd9b0840696578883cad7765a553a4dbfc4b006b6edffa0a854887792d65f729

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.10.17-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 d92000610d7551c804b766d880324a448de425b34d2da08de6c40179f69f135f
MD5 b17a7eaf975c8df9c811818ab5c1fab7
BLAKE2b-256 9b631c0eeca2f1353abf3da6e300c1b2a3510b15f7096975e2522a4e843eed44

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.10.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f48b3759ad2554f9223580832f84eadbecc6b0e4c876f3fa310d7a66b68b9ea7
MD5 e70e923bbf927f5c6066449d41bfd52d
BLAKE2b-256 52485780726b3750f3cb9b70e7efa4404c4d28f6dd54b02b3dcf09f87a71c221

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.10.17-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4afb8029e1c2fcebaf320f08245b3441f1f177d4706e5b5bc164d031fc448a8b
MD5 d3aac2b5b67bf597b4372829292b1051
BLAKE2b-256 dd61f62788b5ddc8d52eb8909fb62e99acb411fb7b5dda1c49d02f0a5be76c17

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.10.17-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 69b23bc1a28927c702358424deb9c3d193ecacc8137ef4434b1b26db44facc79
MD5 df1660cc0c0887e7a3070bdede71c050
BLAKE2b-256 0c4e1011cdee9274001b7cd9f8afeb4c3dd32499f2402388c8a896b4cc7abf90

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.10.17-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 845cd49d0686e36e195d4ade3135d3c5f9f86684c2a84950ecc27802e6d2f03d
MD5 7120cc0ee004739fe13dbd2a9480aecb
BLAKE2b-256 4b0bebd402efeb7d8d7f98e5c7502fd4002f4fca465727fa74103a1203031d03

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.10.17-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 81b64930e48500bc6e6cb96da79cb3d26f848c33226ccac7bdc65f97b5dc82e0
MD5 4756570d3bf0a828ced3b8fd35b9f42a
BLAKE2b-256 a9d874c58c2dcc73b7f69bd45ca4172914b13ff6ee01d3902ecabf781fad32b9

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.10.17-cp38-cp38-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 6fc53f89dac9144eb1d46d2eca42e0cd01971b25e46f10009abea071e0b935b3
MD5 e3967eece728db7fee65a944e520485b
BLAKE2b-256 91c85fc15afd03813a7c5560bb7683e0d306f924b98ed63cfdeaf90ec2a73a97

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