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 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.9 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.9).

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 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.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.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.9

# 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.

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

Uploaded Source

Built Distributions

pytype-2022.8.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

pytype-2022.8.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.2 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

pytype-2022.8.23-cp310-cp310-macosx_10_15_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

pytype-2022.8.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

pytype-2022.8.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.2 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

pytype-2022.8.23-cp39-cp39-macosx_10_15_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

pytype-2022.8.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.2 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

pytype-2022.8.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.2 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

pytype-2022.8.23-cp38-cp38-macosx_10_15_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

pytype-2022.8.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.2 MB view details)

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

pytype-2022.8.23-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.2 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

pytype-2022.8.23-cp37-cp37m-macosx_10_15_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

File details

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

File metadata

  • Download URL: pytype-2022.8.23.tar.gz
  • Upload date:
  • Size: 2.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for pytype-2022.8.23.tar.gz
Algorithm Hash digest
SHA256 c498162248f21cc1e9510070594c8e28461c2c7a935d754c09d492ac7cd03842
MD5 8e9c4b702d2a965171d3ce77a6180691
BLAKE2b-256 b6ca5ba96f47f6134bedc3829703da4ed013c694e2e39c1f48021033f0f04b42

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2022.8.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b9fe9d7d5fcd9b44d8981832ee49123cd5596d8e8ecaf3c7472c9ccc191fadac
MD5 89252a2128f609183fb0e672f6636199
BLAKE2b-256 50bc624751b6d16d5b73e6b698b5cc59436e4cbb0341b02c8acf126cf1fe295a

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2022.8.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3a68f85c59e3d1add8583a5dfd74db3817c7d653134a5955707bce7e31c2785d
MD5 f5a7b8e205f3ba31b690c7303156eed5
BLAKE2b-256 4417e0a1acce1ed27af9c8b6fbbda16713c84de3d594f26f4e4600d7aae25fba

See more details on using hashes here.

Provenance

File details

Details for the file pytype-2022.8.23-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for pytype-2022.8.23-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 92b4e981c71b7f79126ef2c52a04bc2dafc061b88b65427702e95d77882a72ad
MD5 12c39963a7fe6740902fe20b3a8f5294
BLAKE2b-256 ade6d17e2525fd397e7951dc441e181d6401984010bde63b296418d2388ace70

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2022.8.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7781a9ad52487936431f4d110f28ee82bc7683b7250046a350f134a199cde01b
MD5 d54cfaf1bee237d620f7dc5be649babe
BLAKE2b-256 e6e264a2baf5a389d3c6b8a06b4b82bd57c0226f5f06f851d7ef96efbf8899ee

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2022.8.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d822da7464cccd45795460776874dc20be39f15349891a30861e3d0faee54a14
MD5 d89fea0b02fc14257d1a4ef4f92c919b
BLAKE2b-256 71fb7dc611c223c8f7a7af461f5c7bee7d623479ca45dd870343dd7891698985

See more details on using hashes here.

Provenance

File details

Details for the file pytype-2022.8.23-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for pytype-2022.8.23-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 a044f30f417979bf76edb480cb359f36434bc8284a3b6fb6c1a91bff60afaeb0
MD5 a7eec4eb75ba48a98782523ff3f061e5
BLAKE2b-256 09b17f9b98cb455da48be813d66010ac8227a328039af07f522a3cc20407a5d6

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2022.8.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 430a5b5104a96ada9c0f3f4f4320754d08240113ebd5d7a9cf2057c8287a8621
MD5 cddc6eef03dc68cc5457fa0dc3f15a39
BLAKE2b-256 3dadb1f395bc76933335dd196257ac9f06e89af5429b292c5e465bbfe8042421

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2022.8.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4c99099bf3efdfaaadb6c83100e0c0a0a3c1b6b7880a6f3652324c56c854da32
MD5 f31615431e158d0d3c4897d71e3f2119
BLAKE2b-256 9026355c415fbd96ef5aaf8e1713262d85d15e9d8c6c608f9a474d643c79810a

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2022.8.23-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 addd39eccc9f1351acfcde4e0a9c7c11fbae0cc5245abf11b6e1e84b880b142d
MD5 49adb55ec9b194ad97ca300601fa2b44
BLAKE2b-256 b6c6debd97dfb6c827c5598666baa1561887a91151cc8f38d6545eaf4376f6f3

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2022.8.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e9212f982c51f830b043aaa134e04ce9f6b7cc6eb32903959d6ba6fdb55765cc
MD5 2672de70420c670f1200eceaf14be259
BLAKE2b-256 0c0071f77583e390c76e0120abf207540f71506aa957a7656506d56f1001882e

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2022.8.23-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3b766edfa62d214900bcb6572eadd1434d013f5bd701b6ac4d9f557b624293d7
MD5 2375d1da312ec5aae18b4ce2382c93e3
BLAKE2b-256 1d5b6b2407032a28822e14fdc130290688f5fa08115d0eb50448b19eeecd7e8f

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2022.8.23-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 a0ead4f4d33b5ebc4d572bc6e673241828906630e6efc2a2bbadf68d3fe2cbc7
MD5 09192073d614aef37b4c3ac380b2c6c7
BLAKE2b-256 dea56bcb7e6b5d1893d66c5dd0955323eb6b96a15908611be12eaa8799d62b8e

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