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

Uploaded Source

Built Distributions

pytype-2023.2.14-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.2.14-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.2.14-cp310-cp310-macosx_11_0_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

pytype-2023.2.14-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.2.14-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.2.14-cp39-cp39-macosx_11_0_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

pytype-2023.2.14-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.2.14-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.2.14-cp38-cp38-macosx_10_15_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

pytype-2023.2.14-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.2.14-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.2.14-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.2.14.tar.gz.

File metadata

  • Download URL: pytype-2023.2.14.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.2.14.tar.gz
Algorithm Hash digest
SHA256 3aacc2d4ad6b54b937fe28f553df73bad85b1c4e293f08b268f04f99e944793b
MD5 2babf28f06bce63e51af6d266da8bed2
BLAKE2b-256 fb29948fbd25061e3b136f4bcd9f82dab732e14ad39e56c1627a2f216232c640

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.2.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 79bc1f420b41acaaf2d93a98e7478a181fc7342f96576c192fc671c2e98a6ea3
MD5 f827a453e23647eacd218dcbbe730b6a
BLAKE2b-256 b14959226d256e1e01695881ec437278b4dc5010144225fc1769cd504a621b9b

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.2.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2d7ab34a970081c01bf47c8c4c327dc087f96317c38f8e90d87bda04a1449f64
MD5 9a236c8672e873c0631ab874ac7bc04f
BLAKE2b-256 8ba3b1186cdcfa6b65e6b186a2600bca126d5ca967742e135cf806795f6ca746

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.2.14-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 9d66b535235d8f2db2b75e01bf0cf850cbfc672173777905b8265fa9b6e50ac6
MD5 c22ef808018ba3d12becc8b590e7009f
BLAKE2b-256 df610737a0dc7265ffce0fe4e03e259ee5a371f250998ccca60da963582f63a4

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.2.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7e05a098401b9d1c20ca48f8ad74ce95c133efdcb5ed5db33fa8f2b8705b7f5e
MD5 750a010608dba990ed2be34d33a2f0d7
BLAKE2b-256 9f02df3630894ba61150b5904f61e8b6f500347412f0e893aeaefee87d4220b1

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.2.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e9c4e32a97006b11b491753be6f49d227137ad70e34083a113ab2d4c1a70e3cd
MD5 aecfa25c783dba929c6d1c4f0db5577b
BLAKE2b-256 7e6eeff586927038ab3fec7779dce4e9630cd6ea6d01ab1bc17fb4e7a177adcb

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.2.14-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 f22335fa3fe5113f86aa2dfe161fdd5c88fab0197acb78132b454e01013ca0ed
MD5 986174c94e78457299dfb967abed69e7
BLAKE2b-256 f9536f47f04b5831b2aa3fcc2927837ad79d85bc83a9beff574fc5043378f3bf

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.2.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 96de6ed0e9d4d4aabd4256ac49d1de3d66320789df29ca4f5c76a8bb169b98f4
MD5 120ea54151419d95f622e965d5a512b8
BLAKE2b-256 e087ef0e093ad498aa3d134ae4796072cb7a16b6d7ba93b3acb7533975c62713

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.2.14-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8273de2c43cd60b9a82247d6df3d95c28f6d89278f236e1dea4f3d5732b46faa
MD5 3b6fd1ac3d057cbb445b223e0c0ab592
BLAKE2b-256 a40b5f4cce37a35789d2f74776011f2ab8555ac60a39bcdef2c6a307d1c812e5

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.2.14-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 c18929a9cd616954de07c635e4ee84b19eda7c7dfb07ed30e7584fa1be97813a
MD5 01ad9251956c17428f5a502adf152b1b
BLAKE2b-256 1a136d0b96851e96b0a71c09abacc4cbd78eddfbdb0fd03f92223576065df69b

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.2.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9f48db00a8c3cbced9b5f65d64e8ded05edf814369430c5f373b2aeb06b28f54
MD5 bc983b08f0dfc684b60301f7619ae6bd
BLAKE2b-256 01b495d6b0b2cd1b85064a00c9ea59ab68d10443439e1361a820ff6e4d269e8d

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.2.14-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0863bc56545ee981e6ea0ebfbbcb1e0ee036b1160df984ce035f5c962458a279
MD5 cce182c5a18a48af09edd2a77623af47
BLAKE2b-256 5b8ee8609c957a7cf4b913539442f59fe1b118213505f83d75e2b86b31e9e46c

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for pytype-2023.2.14-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 306642df312c695c3230b6bf16397d461e6f16638699b5de5df2187bf3dffb8f
MD5 6c1398cf5fdbb66b7f4f25fe64e3d7e6
BLAKE2b-256 7afb53d572b2904c4eb121c85f763815e8fd79f4442a3d0d1f371e0e318684b4

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