This release is a pre-release and may not be stable for production use.
typsht
type checker agnostic parallel type checking tool. run multiple python type checkers (mypy, pyright, ty, pyre) in parallel on the same code.
inspired by tox, but specifically for type checkers. get comprehensive type checking coverage by running multiple type checkers simultaneously.
installation
quick start (no installation)
use uvx to run typsht without installing it:
# check inline code
uvx typsht 'def foo(x: int) -> str: return x'
# check a file
uvx typsht --file my_module.py
install to your project
uv add typsht
usage
check inline code:
# this will catch the type error across all checkers
typsht 'def foo(x: int) -> str: return x'
check a file:
typsht --file my_module.py
run specific type checkers:
typsht --file my_module.py --checkers mypy --checkers ty
show detailed output from each checker:
typsht --file my_module.py --verbose
project support
typsht automatically detects when checking files in a uv project (containing pyproject.toml or uv.lock) and runs type checkers using uv run --project, giving them access to your local development packages.
this is useful for library developers who want to verify type annotations work across multiple checkers:
# in a project with local packages installed in editable mode
uvx typsht --file repros/test_case.py --verbose
# type checkers will have access to your local package imports
inline code always runs in an isolated environment.
pytest plugin
typsht includes a pytest plugin for running type safety tests across multiple type checkers. the key feature is inline assertions that work identically across mypy, pyright, and ty.
inline assertions (checker-agnostic)
use # R: type for reveal_type assertions and # E: pattern for error assertions:
- case: reveal_type_works_across_checkers
checkers: [mypy, pyright, ty]
main: |
x: list[str] = ["a", "b"]
reveal_type(x) # R: list[str]
- case: error_detected_across_checkers
checkers: [mypy, pyright, ty]
main: |
def foo(x: int) -> str:
return x # E: return
the plugin normalizes type representations (builtins.int -> int, List -> list, Literal[42] -> int) so the same assertion works across all checkers.
legacy format (pytest-mypy-plugins compatible)
also supports the pytest-mypy-plugins format for migrating existing tests:
- case: mypy_specific_output
main: |
x: int = 42
reveal_type(x)
out: 'Revealed type is "builtins.int"'
- case: should_pass_check
main: |
def add(a: int, b: int) -> int:
return a + b
should_pass: true
run the tests:
pytest tests/typesafety/
programmatic assertions
for python tests, use the assertion helpers directly:
from typsht import assert_type_equals, assert_type_error, assert_no_errors, CheckerType
def test_reveal_type():
assert_type_equals('''
x: int = 1
reveal_type(x)
''', line=2, expected_type="int", checkers=[CheckerType.MYPY, CheckerType.PYRIGHT, CheckerType.TY])
def test_catches_error():
assert_type_error('''
def foo(x: int) -> str:
return x
''', error_pattern="return", checkers=[CheckerType.MYPY, CheckerType.PYRIGHT, CheckerType.TY])
def test_valid_code():
assert_no_errors('''
def add(a: int, b: int) -> int:
return a + b
''', checkers=[CheckerType.MYPY, CheckerType.PYRIGHT, CheckerType.TY])
supported type checkers
by default, typsht runs:
- mypy - widely adopted static type checker
- pyright - fast static type checker from microsoft
- ty - experimental blazing-fast type checker
also available (requires project configuration):
- pyre - facebook's type checker (requires .pyre_configuration)
development
install dependencies:
uv sync
run tests:
uv run pytest
install pre-commit hooks:
uv run pre-commit install
Metadata
Release files for typsht 0.0.1a5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| typsht-0.0.1a5.tar.gz | 53.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| typsht-0.0.1a5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 67.0 kB
Release files / typsht-0.0.1a5.tar.gz
| Download URL | typsht-0.0.1a5.tar.gz |
|---|---|
| Size | 53.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d29fb4a5f6012fa2499a4a23b859ca3d6729a574fb029e9ad6c9dcf6c21cf55c
|
|
BLAKE2b-256 checksum How to use checksums |
3c497c8c408fb0add97c0756d8a3f104add93967a1e55a803e5958fc3472ac38
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / typsht-0.0.1a5-py3-none-any.whl
| Download URL | typsht-0.0.1a5-py3-none-any.whl |
|---|---|
| Size | 13.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
63d1a1a6ab43de94d83b844c78b7cc6aa10de33fab3a9e9b062048c1ab9f8d61
|
|
BLAKE2b-256 checksum How to use checksums |
fb45df70ab266a0cc7ac214e6508a4cd08d9d43f35b6206503326ba06fd98835
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|