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 setup.cfg file in the directory immediately above the package, replacing package_name with the package name:

[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 Travis.

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

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.

* Note: On Alpine Linux, installing may fail due to issues with upstream dependencies. See the details of this issue for a possible fix.

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 is 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 setup.cfg file found by walking upwards from the current working directory.

Start off by generating a sample config file:

$ pytype --generate-config pytype.cfg

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.6 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.cfg

# NOTE: All relative paths are relative to the location of this file.

[pytype]

# Space-separated list of files or directories to process.
inputs =
    foo

# Python version (major.minor) of the target code.
python_version = 3.6

# Paths to source code directories, separated by ':'.
pythonpath =
    .:
    ~/repo2

# Comma or 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.cfg ~/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.

2021 Roadmap

  • Python 3.9 support
  • Better performance on large files
  • Support for numerical libraries

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

Uploaded Source

Built Distributions

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

pytype-2021.1.21-cp38-cp38-manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.8

pytype-2021.1.21-cp38-cp38-macosx_10_14_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.8macOS 10.14+ x86-64

pytype-2021.1.21-cp37-cp37m-manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.7m

pytype-2021.1.21-cp37-cp37m-macosx_10_14_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.7mmacOS 10.14+ x86-64

pytype-2021.1.21-cp36-cp36m-manylinux2014_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.6m

pytype-2021.1.21-cp36-cp36m-macosx_10_14_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.6mmacOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: pytype-2021.1.21.tar.gz
  • Upload date:
  • Size: 1.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.3.3 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.7.7

File hashes

Hashes for pytype-2021.1.21.tar.gz
Algorithm Hash digest
SHA256 b79c7c0c9a9df767887bc50c96c1391c9ff3ceacf2a5f3b49ecf57b1d3d86a64
MD5 1943f2c305f3af3a11257e989a30c968
BLAKE2b-256 8903a05461a051d33a5d167201d5e631cb950c6b8e98065a47ab95bc2a5bbe7a

See more details on using hashes here.

File details

Details for the file pytype-2021.1.21-cp38-cp38-manylinux2014_x86_64.whl.

File metadata

  • Download URL: pytype-2021.1.21-cp38-cp38-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.3.3 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.7.7

File hashes

Hashes for pytype-2021.1.21-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 06a9d47e8bbbaa6acc15f3be2cd349c6c1fb76e8599b3fd3e01e7058a7667db0
MD5 e23f345408952c6607068ccf77b062d2
BLAKE2b-256 b8f4777223dd301c778797f1eb55d6cf6e6c6fc2a89526450e82ff2f8a886cac

See more details on using hashes here.

File details

Details for the file pytype-2021.1.21-cp38-cp38-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: pytype-2021.1.21-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.8, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.3.3 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.7.7

File hashes

Hashes for pytype-2021.1.21-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 80c3bd1a55c9fab1d5c41ef20c8e6994844c413b5c24d0327990cf2767e1d18a
MD5 1258695d5082ab6841dca26cb8124799
BLAKE2b-256 db9c6331e47d590469872369445e777595ac92b0e2a3b1afa16bdb86670f1659

See more details on using hashes here.

File details

Details for the file pytype-2021.1.21-cp37-cp37m-manylinux2014_x86_64.whl.

File metadata

  • Download URL: pytype-2021.1.21-cp37-cp37m-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.3.3 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.7.7

File hashes

Hashes for pytype-2021.1.21-cp37-cp37m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7bf6bbe0f3147df64b11b980d070e5045c725946703999de07e077f11e8458c7
MD5 a15487fc969091bae8775f6dac7d5eca
BLAKE2b-256 4961af2d7ed3acf9a75f740b60e2d2c202b5ef041c38467f61b38a99b5543dc2

See more details on using hashes here.

File details

Details for the file pytype-2021.1.21-cp37-cp37m-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: pytype-2021.1.21-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.7m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.3.3 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.7.7

File hashes

Hashes for pytype-2021.1.21-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 b7f44e6e92727402540f360095daff40754d51a9c0ebcaea7c1830c25f9757bc
MD5 7f24c833e50e5385e5a934bd44bc5f68
BLAKE2b-256 34777ba89128fa52394afd652cff13e465fafc6a8debd3ad3174b751bdb23964

See more details on using hashes here.

File details

Details for the file pytype-2021.1.21-cp36-cp36m-manylinux2014_x86_64.whl.

File metadata

  • Download URL: pytype-2021.1.21-cp36-cp36m-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.3.3 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.7.7

File hashes

Hashes for pytype-2021.1.21-cp36-cp36m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4da83ae821081a4043e9a1ffb2e4e238248622dbc9119eea3f9af3bc5b74fafd
MD5 04d2523a6c575acf9d50039dc80681cf
BLAKE2b-256 80d8243ba57dad8e5f22341a34d14625aa4ad3edc150e1d87c3ffeff81ec18c1

See more details on using hashes here.

File details

Details for the file pytype-2021.1.21-cp36-cp36m-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: pytype-2021.1.21-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.6m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.3.3 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.7.7

File hashes

Hashes for pytype-2021.1.21-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 3b08095a2be52a89dfcf7e71608abf1212e6ad7765461dfae0e35adc9037315b
MD5 674992101f1320344be72fa490d0a259
BLAKE2b-256 e5b8551dfe1b796a4926ba2c33e967bf716e30a715ca57af17d2750d38920cf4

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