Microsoft unveils speedy type checker for Python


Microsoft has unveiled , an open source static-type-checking system for Python that aims to be faster than existing type-checking solutions for Python such as Mypy.

Written in TypeScript and running on Node.js, Pyright doesn’t require an existing Python runtime. It is chiefly designed to be used as a Visual Studio Code plugin, but can also run as a standalone command-line tool.

Microsoft claims in the Readme for the project that Pyright is “typically 5X faster” than other Python type checkers that are themselves written in Python, such as Mypy, Pytype, and Pyre. Writing those tools in Python is convenient, but they can only run as fast as Python itself, and Python’s default runtime doesn’t emphasize performance. That said, the performance of these tools aren’t absolutes; it depends mainly on the systems they run on and the code bases they analyze.

Pyright supports all the major type hinting and type-related syntax currently available in Python—, , and . It also supports type inference in many circumstances. The project relies on Python’s own  to perform its analyses, so it can be kept in sync with Python itself even thought it isn’t written in the language.

When run as a Visual Studio Code plugin, it offers live feedback on code—type information displayed with tooltips, symbol defintiion links, and so on. Some of what Pyright offers in this regard overlaps slightly with Microsoft’s  offering, but Pyright’s main focus is type checking and not other code linting features.

The project is still considered a work in progress, with many features listed as unfinished or to-do, such as type inference for generators or validation for async/await declarations. One feature explicitly not planned is support for Python 2; Microsoft doesn’t intended to offer it. By contrast, Mypy, and many other code-linting and type-checking tools for Python, do offer it.

, for example, compiles type-annotated Python to C. Pyright could in time be used as the foundation for a similar project.