Skip to main content

A statically-typed authoring language that compiles to standard Python

Project description

TypePython

TypePython

Write richer types in .tpy. Ship plain .py + .pyi.


TypePython is a typed dialect of Python that compiles to standard .py + .pyi. It brings TypeScript-class ergonomics — sealed classes, exhaustive match, strict null checks, unknown, interface, data class — to a language whose output runs anywhere CPython runs.

No custom runtime. No per-checker plugin. No vendor lock-in.

Status: Core v1 Beta (v0.4.0). Core syntax, config, init/check/build/ clean/verify, diagnostic code identity, and emitted .py/.pyi compatibility are the stable Beta surfaces. LSP UX, adapter manifests, runtime validators, and migration heuristics remain prototype/experimental. Bug reports and contributions are very welcome.

Install

pip install type-python
typepython init --dir hello && cd hello
typepython check --project .
typepython build --project .

You now have .typepython/build/ with .py + .pyi + py.typed ready for any Python interpreter, IDE, or downstream type checker.

  • Wheels are prebuilt for Windows AMD64, macOS x86_64, macOS arm64, and Linux x86_64. Other platforms fall back to source and need Rust + cargo.
  • Python: the package bridge supports 3.9+; generated projects target Python 3.10 through 3.14.

See it in 15 lines

# src/app/expr.tpy

sealed class Expr:
    pass

class Num(Expr):  value: int
class Add(Expr):  left: Expr; right: Expr
class Neg(Expr):  operand: Expr

def evaluate(expr: Expr) -> int:
    match expr:
        case Num(value=v):           return v
        case Add(left=l, right=r):   return evaluate(l) + evaluate(r)
        case Neg(operand=o):         return -evaluate(o)
    # No default branch needed — the compiler proves the match is exhaustive.
    # Add a fourth subclass and TypePython tells you exactly where to update.

typepython build lowers that to ordinary Python and writes a matching .pyi that any modern type checker can consume — no TypePython runtime required.

What you write vs. what ships

You write (.tpy) TypePython emits (.py / .pyi)
interface Drawable: class Drawable(Protocol):
data class User: @dataclass class User:
sealed class Expr: ordinary class + tpy:sealed marker
overload def parse(...) @overload def parse(...)
typealias Pair[T] = tuple[T, T] T = TypeVar("T") + Pair: TypeAlias = tuple[T, T]
def first[T](xs: list[T]) -> T: inline generic on 3.13+, TypeVar-based on 3.10 – 3.12
unsafe: eval(expr) valid Python, marker erased — runtime behavior preserved
unknown (must narrow before use) object in .pyi
Partial[Config] / Pick[Config, …] expanded TypedDict shapes (PEP 655 / 705)

Why not just mypy / pyright / PEP 695?

Capability mypy strict pyright strict PEP 695 .py TypePython .tpy
sealed class + compiler-proved exhaustiveness
unknown — safe dynamic boundary, must narrow
unsafe: audit fence for eval / exec / setattr
First-class interface / data class / typealias via via via keyword
Inline generics def f[T] on any target ≥ 3.10 3.12+ 3.12+ 3.12+
TypedDict transforms (Partial, Pick, Readonly…)
Output consumed by mypy / pyright / ty unmodified N/A N/A

TypePython doesn't replace those checkers. It sits one step earlier: you author in .tpy, the compiler emits standard typed Python that those tools then consume normally.

What you also get

  • Rust-native, incremental compiler — public-API fingerprints skip downstream rechecks when only a body changes.
  • Full toolchaininit, check, build, watch, clean, verify, compat, api-diff, type-health, migrate, lsp.
  • LSP server — hover, go to definition, references, rename, completions, signature help, real-time diagnostics, and code-action quick fixes. Bring your own LSP-capable editor (VS Code, Neovim, Helix, Sublime, Emacs).
  • Standard, portable output — emitted .py + .pyi work with mypy, pyright, and ty out of the box. PEP 561 py.typed is written automatically.
  • Mixed projects.tpy, .py, and .pyi live in the same source tree. .py is pass-through; .pyi is stub-authoritative.

For library authors

Five commands aimed at people who publish typed Python:

typepython build       --project .
typepython verify      --project . --checker-preset all
typepython compat      --project . --profile library-portable
typepython api-diff    dist/previous.whl .typepython/build
typepython type-health --project . --fail-under 85

These catch missing/stale py.typed, wheel ↔ build-tree drift, multi-checker portability gaps, public-API drift between releases, and runtime-annotation hazards for frameworks that introspect annotations.

Documentation

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

type_python-0.4.0.tar.gz (1.1 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

type_python-0.4.0-py3-none-win_amd64.whl (5.3 MB view details)

Uploaded Python 3Windows x86-64

type_python-0.4.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (5.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

type_python-0.4.0-py3-none-macosx_11_0_arm64.whl (4.8 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

type_python-0.4.0-py3-none-macosx_10_13_x86_64.whl (5.2 MB view details)

Uploaded Python 3macOS 10.13+ x86-64

File details

Details for the file type_python-0.4.0.tar.gz.

File metadata

  • Download URL: type_python-0.4.0.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for type_python-0.4.0.tar.gz
Algorithm Hash digest
SHA256 8ef4885aa28a746bcc24f7549133c2c37d42151e6c4cc78666815b1363f32cb6
MD5 324dac8dc6bb2bf9626df061799d7460
BLAKE2b-256 9560931a3e8462687043ad266c001c4fb6bcc71a947e7af004481120e64b3335

See more details on using hashes here.

Provenance

The following attestation bundles were made for type_python-0.4.0.tar.gz:

Publisher: publish.yml on type-python/type-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file type_python-0.4.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: type_python-0.4.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 5.3 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for type_python-0.4.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 dfecc8682965a5055be29f1d70b54f816524345ae93fb382809d8c9a24ed0c6c
MD5 4cd43bf4538827ddd2a9a0a6d01b6d22
BLAKE2b-256 74305e5598a71be37dec5c1488ad015839e09302fe845dc6b8d4f00d809fdde9

See more details on using hashes here.

Provenance

The following attestation bundles were made for type_python-0.4.0-py3-none-win_amd64.whl:

Publisher: publish.yml on type-python/type-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file type_python-0.4.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for type_python-0.4.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 6da0e1cdc88755151bbb3de846e85c558e1c9ffcdd127f54a9db2f774c67899c
MD5 46707a47e51e819c95dcf63edce9e434
BLAKE2b-256 48b462dc7e12fb77c24f4f56fef5b15a0d286c7d5f1a8b8c7cca7464c06a5263

See more details on using hashes here.

Provenance

The following attestation bundles were made for type_python-0.4.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl:

Publisher: publish.yml on type-python/type-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file type_python-0.4.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for type_python-0.4.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 31143584c9111066e3bf540eb50e9f1bb522e6c3c1022c3fd75b04e813fae895
MD5 122f1b96c46eee5198a008d0cfdac198
BLAKE2b-256 b822784a407b6148c695365f07ef91952b2da8259884416a5967b66864dd2dc8

See more details on using hashes here.

Provenance

The following attestation bundles were made for type_python-0.4.0-py3-none-macosx_11_0_arm64.whl:

Publisher: publish.yml on type-python/type-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file type_python-0.4.0-py3-none-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for type_python-0.4.0-py3-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 b0a2b50a781c79408aef8929ecd7cf0953f67bbbe042122b41cebdb08ec90d47
MD5 67a1127942e3f629d577d11982248abb
BLAKE2b-256 55cdacbc82fd5c2c7f59fc92a5752eead2991d2db98c0286f10a85aa41aaabe5

See more details on using hashes here.

Provenance

The following attestation bundles were made for type_python-0.4.0-py3-none-macosx_10_13_x86_64.whl:

Publisher: publish.yml on type-python/type-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page