Comparaison de Pyrefly et Ty : Les Nouveaux Type Checkers Rust-Python en Alpha
Pyrefly vs. ty : Une Nouvelle Génération de Vérificateurs de Typage Python Au début du mois, deux nouveaux vérificateurs de typage Python basés sur Rust sont entrés dans la lumière : pyrefly et ty. Bien que ni l’un ni l’autre ne soit encore officiellement lancé, ils représentent une percée significative dans le domaine dominé historiquement par mypy et Pylance. Dévoilement Officiel Lors du Typing Summit de PyCon 2025, installé dans la discrète Salle 319, les équipes derrière ces outils ont fait leurs premières présentations officielles. Leurs objectifs, visions et approches uniques ont été détaillés, soulignant l'importance de ces outils pour la communauté Python. Pyrefly Pyrefly est le nouveau vérificateur de typage Python basé sur Rust de Meta, remplaçant Pyre (le précédent vérificateur écrit en OCaml). Les promesses sont grandes : une vitesse accrue, une meilleure portabilité et des capacités supérieures. Contrairement à Pyre, Pyrefly aspire à une collaboration plus étroite avec la communauté Open Source, visant à répondre à ses besoins et non seulement aux exigences internes de Meta. ty Ty est également un vérificateur de typage Python basé sur Rust, développé par Astral, la même équipe qui a créé uv et Ruff. Jusqu'à récemment, Astral avait été assez discrète sur ce projet, ne faisant que des lancements discrets sur GitHub et quelques présentations succinctes. Cependant, leur engagement avec la communauté Open Source commence à se manifester davantage. Similitudes Langage : Les deux outils sont écrits en Rust. Incrémentalité : Ils permettent des mises à jour incrémentales, bien que leurs implémentations soient légèrement différentes. AST Parsing : Les deux utilisent Ruff pour l'analyse de l'arbre de syntaxe abstraite (AST). Support : Tous deux offrent un support de première classe pour la vérification de typage en ligne de commande et l'intégration LSP/IDE. Différences Vitesse La vitesse est un point crucial pour Pyrefly, mentionné à plusieurs reprises lors de la présentation. Selon les développeurs, Pyrefly est 35 fois plus rapide que Pyre et 14 fois plus rapide que Mypy et Pyright, pouvant vérifier jusqu'à 1,8 million de lignes de code par seconde. Pour ty, la vitesse est importante, mais moins mise en avant, avec des revendications de l'ordre de 1 à 2 ordres de grandeur plus rapides que les vérificateurs actuels. Pour comparer leur performance, des benchmarks ont été effectués sur les dernières versions de PyTorch (v2.7.0), Django (v5.2.1) et Mypy : PyTorch (plein référentiel) : ty : 4,039 s ± 0,234 s pyrefly : 13,029 s ± 0,136 s pyright : 262,742 s ± 4,948 s mypy : Non pris en charge PyTorch (sous-répertoire torch) : ty : 1,123 s ± 0,022 s pyrefly : 2,347 s ± 0,261 s mypy : 24,731 s ± 0,238 s pyright : 48,096 s ± 1,705 s Django : ty : 578,2 ms ± 27,8 ms pyrefly : 910,7 ms ± 26,2 ms mypy : Échec pyright : 16,324 s ± 0,476 s Mypy (mypy/python/types/mypy : ty : 74,2 ms ± 1,5 ms pyrefly : 136,0 ms ± 1,5 ms mypy : 3,544 s ± 0,099 s pyright : 2,852 s ± 0,103 s Ty semble être globalement plus rapide que pyrefly sur tous les tests, bien que pyrefly détecte plus de fichiers sources dans certaines situations. Objectifs Les objectifs principaux des deux outils varient considérablement. Pyrefly vise l’agressivité maximale dans la déduction de types, garantissant ainsi des contraintes de typage même en l'absence d'annotations explicites. Par exemple, dans ce code : python val = None my_list = [1, "a"] val *= 2 Pyrefly infère les types int | str | None pour val, ce qui permet de détecter l'erreur val * 2. En revanche, ty adopte une approche graduelle, où supprimer une annotation de type ne devrait pas entraîner une erreur de type si le programme fonctionne correctement. Si une erreur de type est détectée, elle indique généralement un problème réel dans le code. Exemple : python foo = Foo() foo.attr = 1 Ty admet que foo.attr = 1 n’est pas une erreur et infère foo.attr comme Unknown | None. Incrémentalité Les deux outils prétendent être incrémentaux, mais leurs approches diffèrent. Pyrefly utilise un moteur incrémental personnalisé, opérant au niveau du module. Ainsi, modifier une fonction requiert le reparse de tout le fichier et de ses dépendances. Ty, en revanche, utilise Salsa, le même cadre incrémental que Rust Analyzer, offrant une incrémentalité granulaire. Chaque modification n'affecte que la fonction concernée et ses dépendantes, ce qui réduit la complexité du code et améliore la maintenabilité. Capacités Inférence implicite de types : Pyrefly excelle dans l'inférence de types implicites, permettant par exemple de déduire les types de fonctions sans annotations explicites. Ty suit le principe de la garantie graduelle, acceptant des collections mixtes de types sans générer d'erreurs. Génériques : Pyrefly s'est concentré sur la résolution de problèmes complexes dès le départ, comme les génériques, les surcharges et les imports de wildcards. Ty offre également une bonne résolution de génériques, mais rencontre des difficultés avec les relations de covariance et de contravariance. Messages d'erreur clairs : Ty met l'accent sur des messages d'erreur précis et concis, facilitant ainsi la compréhension et la résolution des erreurs. Types d'intersection et de négation : Ty est le seul vérificateur de typage Python à prendre en charge les types d'intersection et de négation, introduisant de nouvelles paradigmes de typage en Python. Exemples de types d'intersection et de négation : ```python @final class Other: pass class WithX: def init(self): self.x = 1 obj = WithX() if random.randint(0, 1) else Other() reveal_type(obj) # Ty : WithX ``` Dans cet autre exemple : ```python class MyClass: def foo(self) -> int: return 1 class MySubclass(MyClass): def foo(self) -> str: return "a" obj = MyClass() if random.randint(0, 1) else MySubclass() reveal_type(obj) # Ty : MyClass & ~MySubclass ``` Ty résout ces cas avec des types d'intersection et de négation, ce qui est unique dans l'écosystème Python. Évaluations et Perspectives Bien que pyrefly et ty soient encore en version alpha et incomplets, il est passionnant de voir comment deux approches différente du typage peuvent coexister et se compléter. Ty prend le parti de ne pas introduire d'erreurs de typage superflues, tandis que pyrefly vise une couverture exhaustive des types, potentiellement au détriment de l'ergonomie. Ces outils devraient évoluer et se rapprocher au fil du temps, apportant de nouvelles fonctionnalités et corrections. Ils représentent déjà des avancées majeures dans le domaine de la vérification de typage Python. Essayer Vous pouvez tester pyrefly sur pyrefly.org/sandbox et ty sur play.ty.dev. Des installations via pip et des plugins pour VSCode et d'autres éditeurs sont également disponibles. Autre Perspective Des rumeurs circulent selon lesquelles Google prévoit de rendre Open Source son propre vérificateur de typage Python basé sur Go, ajoutant encore plus de compétition et d'innovation à l'écosystème. Conclusion Il est excitant de voir l'émergence de ces deux nouveaux vérificateurs de typage Python, chacun offrant des fonctionnalités et des approches uniques. Ils promettent de nouvelles perspectives pour la communauté Python, notamment en termes de vitesse et de clarté des erreurs. Leur développement continu sera intéressant à suivre, car ils pourraient bien redéfinir les Standards de vérification de typage en Python. Profil de l’Équipe de Meta - Objectif Principal : Accélérer la vérification de typage, améliorer la portabilité et les capacités. - Approche Open Source : Engagement plus fort avec la communauté Open Source. Profil de l’Équipe d’Astral - Objectif Principal : Garantir une approche graduelle, minimiser les erreurs de typage inutiles. - Innovation : Support des types d'intersection et de négation, messages d'erreur clairs et concis. Évaluations des Professionnels - Vitesse : ty est en moyenne plus rapide. - Ergonomie : ty est plus souple et moins intrusif. - Capacités : pyrefly et ty ont des forces complémentaires, chacun se distinguant sur certains aspects. N'hésitez pas à tester ces outils par vous-même et à partager vos retours ! Contactez-moi à [email protected] si vous avez des questions ou des commentaires.