Ankündigung der Beta-Veröffentlichung von ty
(astral.sh)- ty, ein in Rust geschriebener ultraschneller Python-Type-Checker und Language Server, wurde als Beta-Version veröffentlicht
- Er wurde als Alternative zu mypy, Pyright und Pylance entwickelt und bietet eine 10- bis 60-fach höhere Leistung
- Durch eine inkrementelle Architektur werden bei Code-Änderungen nur die erforderlichen Teile neu berechnet, um die Reaktionsgeschwindigkeit in Echtzeit zu maximieren
- Mit Fokus auf Genauigkeit und Benutzerfreundlichkeit unterstützt ty moderne Features des Type-Systems wie Intersection Types, fortgeschrittenes Type Narrowing und Reachability Analysis
- Astral plant, ty gemeinsam mit Ruff und uv zu einem zentralen Entwicklungswerkzeug des Python-Ökosystems auszubauen
Überblick über ty
- ty ist ein von Astral entwickelter Python-Type-Checker und Language Server, implementiert in Rust
- Er wurde als deutlich schnellere Alternative zu mypy, Pyright und Pylance konzipiert
- Er wird bereits in Astrals internen Projekten umfassend eingesetzt und wird in der Beta-Phase auch externen Nutzern empfohlen
- Astral ist ein Team, das hochperformante Entwicklungswerkzeuge für das Python-Ökosystem entwickelt, und ist bekannt für uv (Paketmanager) und Ruff (Linter und Formatter)
Leistung und Architektur
- ty wurde mit einer Language-Server-zentrierten Struktur entworfen und verwendet einen inkrementellen Verarbeitungsansatz, bei dem bei Dateiänderungen nur notwendige Berechnungen erneut ausgeführt werden
- Dadurch sind Echtzeit-Updates im Editor sehr schnell
- Selbst bei Ausführung ohne Cache ist ty 10- bis 60-mal schneller als mypy und Pyright
- Beispiel: Bei der Änderung zentraler Dateien im PyTorch-Repository beträgt die Zeit zur Neuberechnung der Diagnosen 4,7 ms und ist damit 80-mal schneller als Pyright (386 ms) und 500-mal schneller als Pyrefly (2,38 Sekunden)
- Auch in großen Projekten beträgt der Leistungsunterschied bei inkrementellen Updates oft ein Vielfaches von mehreren Dutzend
Type-System und Genauigkeit
- ty unterstützt Intersection Types, fortgeschrittenes Type Narrowing und typbasierte Reachability Analysis
- Damit liefert es präzises Type-Feedback und reduziert unnötige False Positives
- Das Ziel ist nicht nur mehr Geschwindigkeit, sondern der Aufbau eines Type-Checkers, der sowohl Genauigkeit als auch User Experience verbessert
Diagnosesystem
- ty enthält ein fortschrittliches Diagnosesystem, das von den Fehlermeldungssystemen des Rust-Compilers inspiriert ist
- In einer einzelnen Diagnosemeldung wird der Kontext aus mehreren Dateien gemeinsam dargestellt, sodass Ursache und Lösungsweg eines Problems klarer werden
- Beispiel: Bei einer falschen Zuweisung eines Dictionary-Schlüssels werden sowohl die Stelle des Type-Mismatchs als auch der Deklarationsort angezeigt
- Die Diagnoseausgabe ist die zentrale Schnittstelle von ty und wurde so gestaltet, dass sie für Menschen und KI gleichermaßen leicht verständlich ist
Language-Server-Funktionen
- ty kann in allen Editoren verwendet werden, die LSP (Language Server Protocol) unterstützen, etwa VS Code und Cursor
- Es unterstützt moderne Language-Server-Funktionen wie Go to Definition, Rename Symbol, Autovervollständigung, Auto-Import, semantisches Syntax-Highlighting und Inlay Hints
- Die Installation ist über eine VS-Code-Erweiterung möglich; die CLI kann mit dem Befehl
uv tool install ty@latestinstalliert werden
Ausblick
- Kurzfristige Ziele nach der Beta sind mehr Stabilität und Bugfixes, die Vervollständigung der Python-Type-Spezifikation sowie Unterstützung für Pydantic und Django
- Langfristig soll ty zur Engine für semantische Funktionen in Astrals Toolchain ausgebaut werden
- Geplant sind Features wie Entfernung toten Codes, Erkennung ungenutzter Abhängigkeiten, Reachability Analysis für Sicherheitslücken (CVEs) und typbewusstes Linting
- Astral will ty kontinuierlich verbessern, mit dem Ziel, Python zum produktivsten Programmierökosystem zu machen
Danksagung
- An der Entwicklung von ty waren Dutzende Open-Source-Mitwirkende beteiligt; das Projekt wird unter der MIT-Lizenz veröffentlicht
- Mehrere Personen und Teams aus den Communities rund um Salsa, Elixir und Python Typing lieferten technische Zusammenarbeit und Inspiration
- Das Kernteam von Astral entwickelte ty auf Grundlage eines tiefen Verständnisses von Typentheorie, der Semantik der Python-Runtime und Nutzungsmustern im Ökosystem
2 Kommentare
Astral steht wohl eher auf Python oder auf Rust…
Ganz schön astralisch~
Hacker-News-Kommentare
Es wäre gut, wenn Ty zu dieser Vergleichstabelle hinzugefügt würde
Wenn man sich die Ergebnistabelle zur Python-Typing-Konformität ansieht, sollte man die Leistung von Pyright nicht unterschätzen
Ich habe Ty (LSP) kurz in Emacs ausprobiert, und es funktioniert ziemlich gut. Etwas störend finde ich nur, dass bei der Anzeige von Methodensignaturen die Typannotationen mancher Parameter zu wortreich wirken
Trotzdem halte ich es für wahrscheinlich, dass ich langfristig Ty nutzen werde. Glückwunsch zum ersten Beta-Release
Das hat wenig mit dem zu tun, was für reale Nutzer wichtig ist. (Ich habe im Python Typing Council selbst an Spezifikation und Tests mitgearbeitet)
Ich bin allerdings ein zufriedener Nutzer von uv und plane zu wechseln, sobald Ty stabil genug ist
Astral baut hervorragende Tools, daher hoffe ich, dass das Unternehmen ohne disruptive Monetarisierung gut wächst
Am Ende muss man in manchen Fällen doch zu den bestehenden Tools zurückkehren. Für mich ist korrekte Typprüfung wichtiger als Geschwindigkeit
Vielen Dank an das Astral-Team. Wir nutzen Pydantic intensiv, deshalb freue ich mich darauf, dass für den offiziellen Ty-Release erstklassige Unterstützung vorgesehen ist
Aktuell lassen wir Pyright und Mypy gemeinsam laufen, was sich doppelt anfühlt, weil beide unterschiedliche Fehler finden
Laut dieser Tabelle soll Pyright ein Superset sein, aber meine praktische Erfahrung war anders
Die Analyse ist zwei Jahre alt, also könnte es inzwischen anders sein. Ich würde gern wissen, ob es Beispiele für die Konsolidierung auf nur Pyright in großen Codebasen gibt
In vielen Fällen hat mypy flexibler und präziser inferiert, und Pyright hatte so viele False Positives, dass ich es zeitweise deaktiviert habe
Inzwischen hat sich Pyright vermutlich stark verbessert, aber BasedPyright war für mich eher unproduktiv
In der Community ist die Tendenz stark, mypy abzuwerten und Pyright zu feiern, aber das deckt sich nicht ganz mit meiner Erfahrung
Sie konzentrieren sich vor allem auf die Semantik von Annotationen und sind daher ungeeignet als Kriterium zur Auswahl eines Type Checkers
(Ich habe diese Spezifikation und die Tests ebenfalls im Python Typing Council mitentwickelt)
Der Titel „Ankündigung des Ty-Beta-Releases“ wäre passender gewesen
Ich habe Pyrefly gegenüber Pyright bevorzugt, musste es wegen eines aktuellen Bugs aber auf eine ältere Version festnageln, was lästig war
Als ich Ty installieren wollte, bekam ich einen Kompatibilitätsfehler mit der Cursor-Version
Ich verstehe immer noch nicht, warum es für eine einzige Sprache so viele Type Checker gibt
Müssen Bibliotheksautoren gegen alle Checker testen? Müssen Entwickler nur Bibliotheken verwenden, die einen bestimmten Checker unterstützen?
An Paketgrenzen braucht man explizite Typen, im internen Code gibt es jedoch viel Mehrdeutigkeit
Astral setzt insbesondere die Performance bei inkrementeller Verarbeitung als wichtiges Designziel
Falls nötig, kann man auch selbst Type Stubs bereitstellen, um Kompatibilität sicherzustellen
Mir gefällt, dass Ty die Haltung einnimmt, dass man nicht extra Annotationen hinzufügen muss, nur um einen Type Checker zufriedenzustellen
Frühere Checker waren mit trivialen Warnungen lästig, aber Ty findet echte logische Fehler gut
Ich habe heute zum ersten Mal erfahren, dass Ty auch als Sprachserver (LSP) dient
Das heißt, es kann in Neovim oder VSCode sowohl mypy als auch Pyright ersetzen
Ich frage mich, wie es mit der Django-Unterstützung aussieht. Django hat viel Magic Code, den Type Checker nur schwer behandeln können
Wenn du Django nutzt, ist es vorerst besser, bei mypy oder Pyright zu bleiben
Selbst wenn Ty nicht schnell wäre, fände ich es allein wegen der Unterstützung für Schnittmengen-Typen (A & B) brauchbar
Es ist schön, diese im Standard-Typsystem von Python fehlende Funktion zu sehen
Ich frage mich, ob es für Ruby etwas wie uv gibt. Für Python oder TypeScript nutze ich uv oder bun, aber Ruby wirkt da etwas zurück