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

Uploaded Source

Built Distributions

pytype-2023.1.31-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.31-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.31-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.31-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.31-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.31-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.31-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.31-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.31-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.31-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.31-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.31-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.31.tar.gz.

File metadata

  • Download URL: pytype-2023.1.31.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.31.tar.gz
Algorithm Hash digest
SHA256 a2a2938aab7719675b07f64cb9f58aa01e9ebf0633cab04cca55d0146803273b
MD5 3f48cca92dfa60cd7f988e40814b2ffd
BLAKE2b-256 a84a611d98ba0473dbfb864d7242ea54bcf0b5bb584435e06b26eea41ea4b6e0

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9c131bbeb02eb02a85117f5aea4379f653993723b94acfea25ea53beeb82b235
MD5 943571ac60fd54b97cefd0b5a170ad2c
BLAKE2b-256 216f96b4d6ad165f3e2cce3b64b5165e3f76bf338ecd9d5ccbe5a8db41bc0954

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ccdf1826235f05091fd1db8be361a608465b92e520245358c9785b2631c3c2f9
MD5 b400c864e5448f54e53aed1f60b98a7b
BLAKE2b-256 768a7ab714c9db6e3286b3b2410e52f0f2c381649398c86975360616640b1dd0

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.31-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 57722c63de95e46ac3deac826d6e8c22a8e3c43b63d1583f0f4a8300891667a2
MD5 312883b1c0104ec284df0cf8ceccb341
BLAKE2b-256 c46a2ee0075f3eeefbe66998803daf043ecc41b00058dc62a05c7e049f79a140

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 73f6bf4149063c7b5be1711f1a7ca17e4b76c5d8a420d603d0675c840cd89aa7
MD5 bf763b9b3b5724213d7fe8dd965dbeee
BLAKE2b-256 98e439a7195bba4e6a5481ec791901d424a530a646f34f956d94782dff5e537d

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f1606172e951aec0b194ad4da62076ba5f8e504f13bd43e6fecbcc3e33bcedbf
MD5 3bfa11dbafb3da65e02d65564fe1d72d
BLAKE2b-256 518c81fff967a34396fb12e3053f1c348951af3e41fd2823fffd3624ed509d78

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.31-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 8b814a249c4c7b05f8c41ed43a3c2339fa7d3137b671e8b68805556caebd3ff9
MD5 359f94db6fa32945a0e86ab82ce62fcc
BLAKE2b-256 057691235073af772f61692ade27024a37ad219df76be68af509394e276fee9e

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a04f5cec8e44b6c33534bf2011f811a9dfab472e034b72e27f983ccb0075a156
MD5 120581e6f474eb21b9a1a72164b0a7e1
BLAKE2b-256 f680a6221b707f4e8e76948444f172d235fcb01f74dce37f9a1e3a66e9424ae2

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 dc68e1a65ba7b7f972bd467b210b34fb4dee69454baa3bf3bfbe3ff6b430c49b
MD5 90f38140ed7966f0ba0aa181b8e3818b
BLAKE2b-256 3156ecc12c3b85ce5381d167f879da0ff094f79fd2f361c94f54969f95b78f5c

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.31-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 ce547bcdb83f80cfc768f99978216364f2c8cc53a53187cfe469d030667bb6fa
MD5 ebc60ee235208f0472577a221e1c6972
BLAKE2b-256 190524849e9a6389e07207db94a5f593b067f4301558a24b70eadce089f26ff1

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f9cf78ea4b86c96592fa42d2a78fc5c10cd3d98a1676763f123381981c5a996d
MD5 2444cb26efbf78ecf6cfdfec02880c0e
BLAKE2b-256 028ab65b2770b8512bba1d8b865f4804be7f2fce3024151564e2d8b780729cd9

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8dbbd8adb1fdc7f04e6642405149da759a5c2701a7d7dcbb59f89bdaddc6cf1e
MD5 57c1b48648b3c508e407c30f02aaeca5
BLAKE2b-256 c76f6a268137b97c3845262231854f9e172c63e00369cd4472db8f8381c30382

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.1.31-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 d54827555c3aaa4806b56716e2fd59ca59893a83a4f4ccf5f7ee4dbc9b7c7e01
MD5 ddec0af0eb0191d15f099ce2d7c54a4e
BLAKE2b-256 9fdda3a1a1bd1d290fba7a81511bf18a9d34de7b85bdadd3d7348bd5f1726e8a

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