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

Uploaded Source

Built Distributions

pytype-2023.1.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

pytype-2023.1.17-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.0 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

pytype-2023.1.17-cp310-cp310-macosx_11_0_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

pytype-2023.1.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

pytype-2023.1.17-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.0 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

pytype-2023.1.17-cp39-cp39-macosx_11_0_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

pytype-2023.1.17-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

pytype-2023.1.17-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.0 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

pytype-2023.1.17-cp38-cp38-macosx_10_15_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

pytype-2023.1.17-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

pytype-2023.1.17-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.0 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

pytype-2023.1.17-cp37-cp37m-macosx_10_15_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

File details

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

File metadata

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

File hashes

Hashes for pytype-2023.1.17.tar.gz
Algorithm Hash digest
SHA256 fddbeb51996cfdbb28d77512ee90bd575df98e4ca521d9a80b573728ba32fb2a
MD5 19915f483374adc3ecd872ebbaa6dbba
BLAKE2b-256 c31bb0c8238322b51940d34997024687d96fcbab27f375c0cad388212cdcd8e5

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7155d5dc28b5c725e95f914c015f15214fd5dc83827cabd3357335ffc530d4b8
MD5 12373c741fca7ec8255164d54c402846
BLAKE2b-256 b2b0dc79007cf2cf8df3e87ca8c24691e7c1a42432b39918a6692b9153cebd95

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.17-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5c22038f1bcf85c55bf92db6c6bc8ad09073ef6e7ee12d44a47c7b01c7d46e40
MD5 ed204e31fb91c085784646d17913573b
BLAKE2b-256 eeaf279e8ff475dae42099d62c3dd136770880a0789eb3384103819487bf8a4f

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.17-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 5882c93c2a563fda03d6d2adfdeeafacfc1297de929fd604805ec19fe6d611ab
MD5 0ae9f1f5d392040b4453483a7ac06c5e
BLAKE2b-256 d6e817eae87481346594bad038de3ef17f50680592994f658d457f2b224fc120

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9541395b124afa04c08a3af303c95d97d9d3ef740c33338b851039e92fc74a05
MD5 5a458dc844f2d969651ba2dac1f8fd70
BLAKE2b-256 f8af294f086075523853b2c072db3b459f02fa2a34173f1ae35aa1a5c71fccb5

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.17-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 38275691b76fc8b1181f81f64ad9ccfbfa5e8ed84a6a1e121ef392d09ba25074
MD5 e307c1919a0b1ac009bc27c5b2abbf30
BLAKE2b-256 bc077cd7f03c5079a9294ccff905f9d4cd9f7dd059a4517fc94765d5e6eb7423

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.17-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 834bf5f9a537b6ca22893da168af8cd721c77193e4cbfaf493ec71dfe5d9c851
MD5 3b895089e157a49b6f67b1af47256dba
BLAKE2b-256 7c12d5714e590a8d306f38f5a7c332e8b56766faf54d0d0493434ed556fec904

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.17-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5a00591463f5299eeb6b85a354317a070a963df597fb1b7633403f5e408406d8
MD5 fa771a8912b2a7960a8a80fc7f008097
BLAKE2b-256 6173727d10c5c079d13e4430555cdd01a922b619216ebcc92e6ce5e24a49a932

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.17-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ea24438007f7138cd372a08003bd04e27da6ed4191a132a95154c9b76a8c24e9
MD5 38808016d531af6f3a837ed386f817d0
BLAKE2b-256 fdd057820f088283b9dc2a56caa2351daa587d9f28d5f6805793ad4a70703e90

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.17-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 0ea5489416b0a11ded354f6054b02e8d1d3fc655e32f9ef8a915d9cc8471d7fd
MD5 fac42769cc39cd376debe6a88e66ba62
BLAKE2b-256 e567dfdbfe5b26b4f7b74948ae341f3c5a9aed661adda7b58672f37146e354b4

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.17-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 94bfcd7abf8146dc97e225bfe7548edc90a0125216b3d23e2252445315cfc14a
MD5 e5fcff2c61a4e8ec055b4d085dd1d0e3
BLAKE2b-256 a72644587384659d873726adfe7bd350423daf4f142b24498de032e9c5fb8b4c

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.17-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3e040cd335cc4a2993e503a2a41f7c82cde702e2c25b2e888bc8f3c8dadebc6b
MD5 d9cb39bfa058cec7f34c10ac302f1928
BLAKE2b-256 202ab4910ae8c7a97f5f427249065eb702e273b4dc354a18d7b70f1d69298fec

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.17-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 27cf7d1ed9b3d2537d2d8b7896ce0e45dcb03027862664380874a97d0af05e26
MD5 3c022d76259592340e83e65fe960200d
BLAKE2b-256 f85765a5425beb66b38b2f6a9f367128706ce7227e9c523ef84d464a4dcf62d5

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