Demystify Python Types for PEP 729 — Kir Chou

Explore Python's type system evolution through PEP 729, examining type checker differences, implementation challenges, and efforts to standardize typing behavior across Python.

Key takeaways
  • PEP 729 aims to establish a new governance model for Python’s type system, endorsed by maintainers of major type checkers (mypy, pytype, pyright, pyre)

  • Python has multiple type checking approaches:

    • CPython interpreter’s runtime type checking
    • Static type checkers (mypy, pytype, pyright, pyre)
    • Gradual typing system introduced in PEP 484
  • Different type checkers can produce different results because they:

    • Have different implementation approaches
    • Handle type inference differently
    • Have varying levels of strictness
  • Type consistency rules in Python:

    • Any type is consistent with all other types by default
    • Variables without type annotations default to ‘Any’ type
    • Type checkers determine if types are compatible at compile time
  • Main type checker differences:

    • mypy: Fastest adoption of new features, good IDE integration
    • pytype: Better type inference, higher coverage
    • pyright (Microsoft): Focus on IDE integration
    • pyre (Meta): Optimized for large codebases
  • Implementation timeline challenges:

    • CPython typically implements new typing features in ~3 months
    • Type checkers take 8-21 months to support new features
    • This creates a noticeable gap in feature support
  • Typing system design considerations:

    • Based on gradual typing theory
    • Allows partial typing of code
    • Must balance static checking with runtime performance
    • Needs to maintain backwards compatibility
  • PEP 729 aims to:

    • Standardize type checking behavior
    • Reduce implementation time gaps
    • Improve coordination between type checker implementations
    • Create clearer governance for Python’s type system