-
Proposed 2006 · shipped 2008 in Python 3.0
Language
Function annotations provide the syntax
PEP 3107 added a place to attach arbitrary expressions to
function parameters and return values, deliberately without
prescribing what they mean. Types were one suggested use among
several. It was proposed in 2006 and the syntax shipped two
years later in Python 3.0; the interpretation came later still.
PEP 3107: Function Annotations
-
2012
Tools
Google starts building pytype
Work began on pytype to bring static checking to Google's very
large Python codebase. It took an inference-first approach:
rather than requiring annotations, it inferred types and
recorded them in separate interface files. This is when
development started, not a public release.
google/pytype README
-
December 7, 2012
Tools
mypy's source becomes public
Jukka Lehtosalo released the source of an experimental checker
for a Python dialect with optional static types. The early
prototype was not today's mypy, but it made the case that
gradual typing could work in practice, and it shaped the
standard that followed.
mypy news
-
2015 · Python 3.5
Language
PEP 484 standardizes type hints
One shared vocabulary, so that a person, a checker and an editor
could all read the same annotation and agree on what it meant.
PEP 484 brought the typing module into the standard
library and gave static type checkers a shared interpretation of
annotations, while deliberately leaving their runtime meaning
unchanged.
PEP 484: Type Hints
-
2015 onward
Ecosystem
Typeshed becomes shared infrastructure
Every checker needs to know the types of the standard library
and of popular third-party packages. Rather than each tool
maintaining its own copy, typeshed collects those stubs in one
repository that the whole ecosystem contributes to and depends
on, including teams who otherwise compete on checkers.
python/typeshed
-
2016 · Python 3.6
Language
Variable annotations become syntax
PEP 526 extended annotations past function signatures to
variables, class attributes and module-level names, so a type
could be stated where the value is defined instead of in a
comment.
PEP 526: Syntax for Variable Annotations
-
May 2018
Tools
Pyre is open-sourced
Meta released Pyre, a checker built for codebases large enough
that incremental performance is a design constraint rather than
an optimisation. This is its public-release milestone; work on
it had been under way internally beforehand.
Meta engineering: Pyre retrospective
-
2018 · Python 3.7 era
Ecosystem
Types travel with packages
PEP 561 answered a practical question: how does a checker find
the types for a dependency you installed? A package ships a
py.typed marker with inline annotations, or ships
stubs, or a separate -stubs distribution provides
them. This is the machinery that decides whether your
dependencies are usefully typed for you.
PEP 561: Distributing and Packaging Type Information
-
2019
Tools
Pyright joins the ecosystem
Microsoft released Pyright, a checker designed to be fast enough
to run continuously inside an editor. It tied checking closely to
the editing experience, a pattern most later tools followed.
Pyright the checker is distinct from the Pylance extension that
builds on it.
microsoft/pyright
-
2019 · Python 3.8
Language
Protocols describe structural interfaces
PEP 544 gave duck typing a static form: a type can be defined by
the methods an object has rather than by what it inherits from.
It let the type system describe how Python is actually written.
PEP 544: Protocols, structural subtyping
-
2020–2022 · Python 3.9–3.11
Language
Everyday annotations get shorter
A run of changes made ordinary annotations less noisy, which did
more for adoption than any single large feature:
list[str] instead of importing
List, X | None instead of
Optional[X], and Self for methods that
return their own class.
Which PEP shipped when
PEP 585 (built-in generics) in Python 3.9, PEP 604
(X | Y unions) in Python 3.10, and PEP 673
(Self) in Python 3.11.
PEP 585
PEP 604
PEP 673
-
2023 · Python 3.12
Language
Type parameters get dedicated syntax
PEP 695 introduced def f[T](x: T) -> T and the
type statement, so generics no longer required
declaring a TypeVar separately. It also defined a new
annotation scope and lazy evaluation for type aliases and type
parameter bounds and constraints.
PEP 695: Type Parameter Syntax
-
November 20, 2023
Governance
PEP 729 establishes the Typing Council
With several independent checkers in wide use, "what does this
annotation mean?" needed an answer that was not just one tool's
behaviour. PEP 729 set up a council and made it responsible for
the maintained typing specification and a conformance test suite
that implementations can be measured against. This date is the
PEP's resolution, not a membership announcement.
PEP 729: Typing governance process
-
December 9, 2024
Ecosystem
The 2024 typing survey asks developers directly
The first of the annual typed-Python surveys reported what people
get out of typing and where it still hurts. Incomplete or
incorrect types in third-party libraries came through as a
recurring source of friction.
See the survey section below.
Typed Python in 2024
-
May 15, 2025
Tools
Pyrefly's public alpha
Meta announced Pyrefly, a type checker and IDE experience written
in Rust, building on lessons from its work on Pyre.
Introducing Pyrefly
-
June 10, 2025
Tools
ZubanLS reaches public alpha
A Rust-based type checker and language server from the author of
the Jedi language server, aiming at mypy-compatible behaviour.
Later milestones
ZubanLS went on to a beta release and was open-sourced later
in 2025; the project blog tracks the sequence.
ZubanLS blog
-
August 20, 2025
Tools
pytype winds down feature development
Google announced that pytype's new feature development is ending
and that Python 3.12 is its final supported version,
as investment shifts toward other approaches. The project's FAQ
still allows for bug fixes. This is a wind-down of feature work,
not a statement that the repository was archived or that all
maintenance stopped that day.
Why this one matters to the story
pytype opened this timeline in 2012 and closes a chapter of it
here. It was the most prominent inference-first checker: it
aimed to be useful on code that had no annotations at all,
where the rest of the ecosystem converged on reading
annotations developers write. Neither approach is universally
better, and the trade-off it explored has not gone away.
pytype README
pytype FAQ
-
December 16, 2025
Tools
ty reaches beta
Astral's Rust-based type checker and language server moved to
beta, having been introduced publicly earlier in 2025.
Astral: ty
-
December 22, 2025
Ecosystem
The 2025 survey revisits adoption and friction
A second year of responses, and the same headline complaint:
library types that are missing, incomplete or wrong.
See the survey section below.
Python typing survey 2025
-
May 12, 2026
Tools
Pyrefly reaches version 1.0
Pyrefly released version 1.0, its first stable release after the
type checker and IDE experience entered public alpha in 2025.
Pyrefly 1.0
-
2026
Open question
What are types for in an agentic world?
Every entry above already happened. This one has not. Coding
agents now read and write a lot of Python, and it is an open
question how much the type system should be built for them as
well as for people. Nobody has the answer yet, which is exactly
why it belongs at the end of the story rather than in it.
Read the open questions.