4 vérificateurs de type Python pour garder votre code propre

Au début, Python n'avait pas de décorations de type. Cela correspond à l'objectif global de rendre le langage rapide et facile à utiliser, avec des types d'objets flexibles qui s'adaptent aux rebondissements de l'écriture de code et aident les développeurs à garder leur code concis.

Au cours des dernières années, cependant, Python a ajouté la prise en charge des annotations de type, inspirant toute une culture de logiciels consacrés à la vérification de type Python pendant le développement. Python ne vérifie pas les types au moment de l'exécution - du moins, pas encore. Mais en tirant parti d'un bon vérificateur de type, en utilisant un fusil de chasse avec vous dans votre IDE de choix, vous pouvez utiliser les annotations de type Python pour éliminer de nombreuses erreurs courantes avant qu'elles n'entrent en production.

Dans cet article, nous allons explorer quatre des principaux modules complémentaires de vérification de type pour Python. Tous suivent à peu près le même modèle, analysant le code Python avec des annotations de type et fournissant des commentaires. Mais chacun offre ses propres ajouts utiles au concept de base.

Mypy

Mypy était sans doute le premier système de vérification de type statique pour Python, car les travaux ont commencé en 2012, et il est toujours en développement actif. Il s'agit essentiellement du prototype du fonctionnement des bibliothèques de vérification de type tierces en Python, même si de nombreuses autres sont apparues depuis et ont développé ses fonctionnalités.

Mypy peut fonctionner de manière autonome, ou à partir de la ligne de commande, ou il peut fonctionner dans le cadre d'un éditeur ou de l'intégration linter de l'IDE. De nombreux éditeurs et IDE intègrent Mypy; L'extension Python de Visual Studio Code peut fonctionner directement avec lui. Lorsqu'il est exécuté, Mypy génère des rapports sur la cohérence de votre code en fonction des informations de type qu'il fournit.

Si votre code n'inclut pas d'annotations de type, Mypy n'effectuera pas la grande majorité de ses vérifications de code. Cependant, vous pouvez utiliser Mypy pour signaler le code non annoté. Cela peut être fait avec différents degrés de rigueur en fonction de ses besoins.

Si vous partez de zéro avec une base de code et que vous voulez une stratégie de linting préventivement agressive, vous pouvez utiliser l' --strictoption pour empêcher tout code non typé. D'un autre côté, si vous travaillez avec une base de code héritée qui n'a pas beaucoup de définitions de type, vous pouvez utiliser des options plus souples, comme empêcher uniquement les définitions de fonction non typées avec  --disallow-untyped-defs tout en autorisant d'autres codes non typés. Et vous pouvez toujours utiliser des commentaires en ligne # type: ignorepour éviter que des lignes individuelles ne soient signalées.

Mypy peut utiliser des fichiers stub PEP 484 lorsque vous souhaitez utiliser des indicateurs de type pour les interfaces publiques d'un module. En plus de cela, Mypy propose stubgen, un outil qui génère automatiquement des fichiers stub à partir du code existant. Pour le code non typé, les fichiers stub utilisent des types génériques, que vous pouvez ensuite baliser si nécessaire.

Pytype

Pytype, créé par Google, diffère des goûts de Mypy en utilisant l'inférence au lieu de simplement des descripteurs de type. En d'autres termes, Pytype tente de déterminer les types en analysant le flux de code, plutôt que de se fier strictement aux annotations de type.

Pytype se trompe de clémence chaque fois que cela a du sens. Si vous avez une opération qui fonctionne à l'exécution et qui ne contredit aucune annotation, Pytype n'en parlera pas. Cependant, cela signifie que certains problèmes qui devraient être signalés (par exemple, déclarer une variable avec un type à un moment donné puis la redéfinir dans le même contexte) passent inopinément. La documentation indique que de telles choses seront interdites à un moment donné dans le futur.

Si vous choisissez d'ajouter des annotations de type à votre code, la reveal_typefonction de Pytype  est particulièrement pratique. Si vous insérez une instruction dans votre code qui lit reveal_type(expr), Pytype évalue expret émet une alerte qui décrit son type. 

Notez que certains comportements de Pytype sont contrôlés en ajoutant des attributs au code lui-même. Par exemple, si vous souhaitez empêcher Pytype de se plaindre d'attributs manquants ou de membres de module définis dynamiquement, vous devez ajouter l'attribut _HAS_DYNAMIC_ATTRIBUTES = Trueà la classe ou au module en question, au lieu de définir une sorte de métadonnées de configuration de Pytype.

Droits d'auteur / Pylance

Pyright est le vérificateur de type Python de Microsoft, inclus dans l'extension Pylance pour Visual Studio Code. Si vous êtes déjà un utilisateur de VS Code, l'extension Pylance est le moyen le plus pratique de travailler avec Pyright; installez-le et partez. Pyright offre une bonne expérience de vérification de type et de linting de code tout-en-un, avec beaucoup des mêmes avantages et avancées que les outils d'analyse Python précédents.

Comme Pytype, Pyright peut fonctionner avec des bases de code qui n'ont aucune information de type. Dans ces cas, Pyright fera de son mieux pour déduire quels types sont en jeu. Ainsi, vous pouvez toujours obtenir de bons résultats avec Pytype sur des bases de code plus anciennes sans déclaration de type. Mais vous obtiendrez de meilleurs résultats au fil du temps en ajoutant progressivement des annotations de type à votre code.

Pyright est très flexible de manière à compléter les conceptions de projets Python réels. Comme pour les autres vérificateurs de type, Pyright peut être configuré sur une base par projet avec un fichier de configuration au format JSON dans le répertoire du projet. Les chemins individuels peuvent être exclus (jamais vérifiés) ou ignorés (erreurs et avertissements supprimés) dans le fichier de configuration, et les options sont très granulaires.

Dans VS Code, les espaces de travail avec plusieurs racines peuvent chacun avoir leur propre configuration Pyright, au cas où différentes parties du projet auraient besoin de configurations de linting différentes. Dans la même veine, vous pouvez définir plusieurs «environnements d'exécution» au sein d'un projet, chacun avec ses propres chemins venv ou import.

Bûcher 

Créé par les développeurs de Facebook et Instagram, Pyre est en fait deux outils en un: un vérificateur de type (Pyre) et un outil d'analyse de code statique (Pysa). Les deux sont conçus pour fonctionner main dans la main pour fournir un niveau de vérification et d'analyse plus élevé que les autres outils, bien que l'utilisateur doive faire un peu de travail pour en tirer pleinement parti.

Pyre adopte une approche similaire à Pytype et Mypy. Le code non typé est traité de manière plus indulgente que le code typé, vous pouvez donc commencer avec une base de code Python non typée et ajouter des annotations fonction par fonction et module par module. Activez le «mode strict» dans un module et Pyre signalera toutes les annotations manquantes. Ou vous pouvez faire du mode strict le mode par défaut et vous désinscrire au niveau du module. Pyre fonctionnera également avec les fichiers stub au format .pyi.

Pyre a une fonctionnalité puissante pour migrer les bases de code vers un format typé. L' inferoption de ligne de commande ingère un fichier ou un répertoire, fait des suppositions éclairées sur les types utilisés et applique les annotations aux fichiers. Cependant, vous voudrez d'abord faire des sauvegardes de votre code! (Si vous souhaitez obtenir des informations de type à partir d'un programme Python en cours d'exécution , vous pouvez le faire avec un autre projet Facebook / Instagram, MonkeyType.)

Alors que les fonctionnalités de Pyre font écho à celles des autres packages détaillés ici, Pysa est unique. Pysa effectue une «analyse de souillure» sur le code pour identifier les problèmes de sécurité potentiels, en s'appuyant sur une bibliothèque d'analyses de flux pour certains composants logiciels et en signalant le code qui semble vulnérable. Tout ce qui est touché par ce code sera également marqué comme corrompu, bien que vous puissiez spécifier des composants qui nettoient les données et suppriment ces données du graphique de teinte.

Un inconvénient est que la bibliothèque d'analyses des composants tiers de Pysa est encore petite, vous devrez peut-être concevoir votre propre modèle. Mais la plupart des analyses de souillure concernent des logiciels largement utilisés, tels que le framework Web Django, l'ORM SQL Alchemy et la bibliothèque de science des données Pandas, sans parler des analyses des problèmes de système de fichiers courants.

Comment faire plus avec Python

  • Comment travailler avec le type de données Liste Python
  • Comment empaqueter des applications Python avec BeeWare Briefcase
  • Comment faire fonctionner Anaconda côte à côte avec d'autres pythons
  • Comment utiliser les classes de données Python
  • Démarrez avec async en Python
  • Comment utiliser asyncio en Python
  • 3 étapes pour une refonte asynchrone Python
  • Comment utiliser PyInstaller pour créer des exécutables Python
  • Tutoriel Cython: Comment accélérer Python
  • Comment installer Python de manière intelligente
  • Comment gérer des projets Python avec Poetry
  • Comment gérer des projets Python avec Pipenv
  • Virtualenv et venv: les environnements virtuels Python expliqués
  • Python Virtualenv et Venv à faire et à ne pas faire
  • Explication des threads et sous-processus Python
  • Comment utiliser le débogueur Python
  • Comment utiliser timeit pour profiler le code Python
  • Comment utiliser cProfile pour profiler le code Python
  • Comment convertir Python en JavaScript (et inversement)