Python - Typing
Static type checkers
9_ENTRIES- basedmypy
Based static typing with baseline functionality.
- basedpyright
Pyright fork with improvements to VSCode support and various other fixes.
- mypy
Optional static typing (PEP 484).
- pyanalyze
Extensible static analyzer and type checker.
- PyCharm
IDE for Professional Developers.
- pylyzer
A fast static code analyzer & language server for Python, written in Rust.
- pyre
Performant type-checker.
- pyright
Fast type checker meant for large Python source bases. It can run in a βwatchβ mode and performs fast incremental updates when files are modified.
- pytype
Tool to check and infer types - without requiring type annotations.
Dynamic type checkers
8_ENTRIES- beartype
Unbearably fast
O(1)runtime type-checking in pure Python. - pydantic
Data parsing using Python type hinting. Supports dataclasses.
- pytypes
Provides a rich set of utilities for runtime typechecking.
- strongtyping
Decorator which checks whether the function is called with the correct type of parameters.
- typedpy
Type-safe, strict Python. Works well with standard Python.
- typeguard
Another one runtime type checker.
- typical
Data parsing and automatic type-coercion using type hinting. Supports dataclasses, standard classes, function signatures, and more.
- trycast
Parse JSON-like values whose shape is defined by typed dictionaries (TypedDicts) and other standard Python type hints.
Stub packages
17_ENTRIES- asgiref
ASGI specification, provides asgiref.typing module with type annotations for ASGI servers.
- boto3-stubs
Stubs for boto3.
- botostubs
Gives you code assistance for any boto3 API in any IDE.
- celery-types
Type stubs for Celery and its related packages django-celery-results, ampq, kombu, billiard, vine and ephem.
- django-stubs
Stubs for Django.
- djangorestframework-stubs
Stubs for DRF.
- grpc-stubs
Stubs for grpc.
- lxml-stubs
Stubs for lxml.
- PyQt5-stubs
Stubs for PyQt5.
- python-phonenumbers-stubs
Stubs for phonenumbers.
- pythonista-stubs
Stubs for Pythonista.
- scipy-stubs
Stubs for SciPy.
- sqlalchemy-stubs
Stubs for SQLAlchemy.
- sqlalchemy2-stubs
Official stubs and mypy plugin for SQLAlchemy.
- torchtyping
Enhanced type annotations for PyTorch.
- types-aiobotocore
Stubs for aiobotocore.
- typeshed
Collection of library stubs, with static types.
Additional types
8_ENTRIES- meiga
Simple, typed and monad-based Result type.
- option
Rust like Option and Result types.
- optype
Opinionated
collections.abcandoperatorsalternative: Flexible single-method protocols and typed operators with predictable names. - phantom-types
Phantom types.
- returns
Make your functions return something meaningful, typed, and safe.
- safetywrap
Fully typesafe, Rust-like Result and Option types.
- typet
Length-bounded types, dynamic object validation.
- useful-types
Collection of useful protocols and type aliases.
Backports and improvements
3_ENTRIES- future-typing
Backport for type hinting generics in standard collections and union types as
X | Y. - typing-extensions
Backported and experimental type hints.
- typing-utils
Backport 3.8+ runtime typing utils(for eg: get_origin) & add issubtype & more.
Linters
9_ENTRIES- flake8-annotations-complexity
Plugin for flake8 to validate annotations complexity.
- flake8-annotations
Plugin for flake8 to check for presence of type annotations in function definitions.
- flake8-pyi
Plugin for Flake8 that provides specializations for type hinting stub files.
- flake8-type-checking
Plugin to help you guard any type-annotation-only import correctly.
- flake8-typing-imports
Plugin which checks that typing imports are properly guarded.
- flake8-typing-only-imports
flake8 plugin that helps identify which imports to put into type-checking blocks, and how to adjust your type annotations once imports are moved.
- flake8-type-ignore
flake8 plugin to disallow type: ignore comments in your typed Python code.
- wemake-python-styleguide
The strictest and most opinionated Python linter ever.
- Ruff
Extremely fast linter which supports lint rules from many other lint tools, such as flake8.
Testing
4_ENTRIES- mypy-test
Test mypy plugins, stubs, custom types.
- pytest-mypy-plugins
Pytest plugin for testing mypy types, stubs, and plugins.
- pytest-mypy-testing
Pytest plugin to test mypy static type analysis.
- pytest-mypy
Mypy static type checker plugin for Pytest.
Working with types
11_ENTRIES- com2ann
Tool for translation of type comments to type annotations.
- merge-pyi
Part of pytype toolchain, applies stub files onto source code.
- mypy-baseline
Integrate mypy with existing codebase. A CLI tool that filters out existing type errors and reports only new ones.
- mypy-protobuf
Tool to generate mypy stubs from protobufs.
- mypy-silent
Silence mypy by adding or removing code comments.
- mypyc
Compiles mypy-annotated, statically typed Python modules into CPython C extensions.
- retype
Another tool to apply stubs to code.
- typeforce
CLI tool that enriches your Python environment with type annotations, empowering mypy.
- typesplainer
A Python type explainer.
- typing-inspect
The typing_inspect module defines experimental API for runtime inspection of types defined in the
typingmodule. - typing-json
Lib for working with typed objects and JSON.
Helper tools to add annotations to existing code
15_ENTRIES- autotyping
Automatically add simple return type annotations for functions (bool, None, Optional).
- infer-types
CLI tool to automatically infer and add type annotations into Python code.
- jsonschema-gentypes
Generate Python types based on TypedDict from a JSON Schema.
- monkeytype
Collects runtime types of function arguments and return values, and can automatically generate stub files or even add draft type annotations directly to your code based on the types collected at runtime.
- no_implicit_optional
A codemod to make your implicit optional type hints PEP 484 compliant.
- pyannotate
Insert annotations into your source code based on call arguments and return types observed at runtime.
- PyTypes
Infer Types by Python Tracing.
- pyre infer
Pyre has a powerful feature for migrating codebases to a typed format. The infer command-line option ingests a file or directory, makes educated guesses about the types used, and applies the annotations to the files.
- pytest-annotate
Pyannotate plugin for pytest.
- pytest-monkeytype
MonkeyType plugin for pytest.
- pytype annotate-ast
A work-in-progress tool to annotate the nodes of an AST with their Python types.
- RightTyper
A tool that generates types for your function arguments and return values. RightTyper lets your code run at nearly full speed with almost no memory overhead.
- type4py
Deep Similarity Learning-Based Type Inference.
- typilus
A deep learning algorithm for predicting types in Python. Also available as a GitHub action
- auto-optional
Makes typed arguments Optional when the default argument is
None.
Mypy plugins
7_ENTRIES- kubernetes-typed
Plugin for Kubernetes CRD type checking.
- loguru-mypy
Plugin for loguru support.
- mypy-zope
Plugin for zope.interface support.
- mypy/plugins
Plugins already integrated into mypy.
- pynamodb-mypy
Plugin for PynamoDB support.
Integrations
6_ENTRIES- emacs-flycheck-mypy
Mypy integration for Emacs.
- mypy-playground
Online playground for mypy.
- mypy-pycharm-plugin
Mypy integration for PyCharm.
- pylance
PyRight integration for VSCode.
- vim-mypy
Mypy integration for Vim.
- nbQA
Run type checkers (e.g. Mypy) on Jupyter Notebooks.
PEPs
18_ENTRIES- PEP-3107
Function Annotations.
- PEP-482
Literature Overview for Type Hints.
- PEP-483
The Theory of Type Hints.
- PEP-484
Type Hints.
- PEP-526
Syntax for Variable Annotations.
- PEP-544
Protocols: Structural subtyping (static duck typing).
- PEP-557
Data Classes.
- PEP-560
Core support for typing module and generic types.
- PEP-561
Distributing and Packaging Type Information.
- PEP-563
Postponed Evaluation of Annotations.
- PEP-585
Type Hinting Generics In Standard Collections.
- PEP-586
Literal Types.
- PEP-589
TypedDict: Type Hints for Dictionaries with a Fixed Set of Keys.
- PEP-591
Adding a final qualifier to typing.
- PEP-593
Flexible function and variable annotations.
- PEP-604
Complementary syntax for Union[].
- PEP-612
Parameter Specification Variables.
- PEP-613
Explicit Type Aliases.
Third-party articles
16_ENTRIES- 1-minute guide to real constants in Python
Full tutorial about
Finalconstants and inheritance. - Simple dependent types in Python
Full tutorial about
Literaltypes. - Testing mypy stubs, plugins, and types
Full tutorial about testing mypy types.
- Our journey to type checking 4 million lines of Python
Dropbox has been one of the first companies to adopt Python static type checking at this scale.
- PyTest MonkeyType Introduction
Type Annotate an existing Python Django Codebase with MonkeyType.
- The state of type hints in Python
As of May 2018.
- Type hints cheat sheet
Cheat sheet on writing type annotations by MyPy team.
- Typechecking Django and DRF
Full tutorial about type-checking Django.
- Type Check Your Django Application
An article based on two recent talks on adding type checks to Django.
- typing
Official Python documentation for
typingmodule. - Python-typing-koans
A set of examples to learn optional static typing in Python.
- Python Type Checking (Guide)
In this guide, you will get a look into Python type checking.
- Adding type hints to urllib3
Tests are not enough: Case study adding type hints to urllib3.
- Adam Johnsons Blog
Adam Johnson blogs about typing practices.
- ParamSpec Guide
Newly released feature in
PEP612allows you do a lot of advanced typing things with functions and their signatures. - Static Typing Python Decorators
Accurately static typing decorators in Python is an icky business. The wrapper function obfuscates type information required to statically determine the types of the parameters and the return values of the wrapped function.