Python est un langage typé dynamiquement, une caractéristique voulue par ses auteurs pour que le langage soit rapide et facile à utiliser. Ainsi, le type des objets est flexible et s'adapte aux méandres de l'écriture de code, et les développeurs peuvent écrire leur code de manière concise. Ces dernières années cependant, Python s’est doté du support des annotations de type, favorisant l’émergence de nombreux logiciels consacrés à la vérification des types dans Python pendant le développement. Python ne vérifie pas les types au moment de l'exécution, du moins, pas encore. Mais avec un bon vérificateur de types, et dans l'IDE de son choix, le développeur peut utiliser les annotations de type de Python pour supprimer de nombreuses erreurs courantes avant la mise en production.

Voilà une sélection de quatre outils de vérification de type pour Python. Tous suivent à peu près la même logique d’analyse de code Python avec annotations de type et feedback. Mais chacun apporte une fonction spécifique à la vérification de base.

Mypy

Mypy a été sans doute le premier système de vérification de type statique pour Python, puisque les premières versions sont sorties en 2012 et qu'il est toujours en cours de développement actif. Cet outil montre parfaitement comment fonctionnent les bibliothèques de vérification de types tierces en Python, même si de nombreuses autres bibliothèques ont vu le jour depuis et ont élargi ses fonctionnalités. Mypy peut fonctionner de manière autonome, à partir de la ligne de commande, à l’intérieur d'un éditeur ou intégré comme linter dans l'IDE. De nombreux éditeurs de code et d’IDE intègrent Mypy. L'extension Python de Visual Studio Code peut fonctionner directement avec cet outil. Quand il est exécuté, Mypy génère des rapports sur la cohérence du code en fonction des informations de type qu'il fournit. Si le code ne comporte pas d'annotations de type, Mypy n'effectuera pas la grande majorité de ses contrôles de code. Cependant, on peut utiliser Mypy pour signaler un code non annoté. Cette opération peut être plus ou moins précise et rigoureuse selon les besoins.

Si le développeur part de zéro avec une base de code et qu’il adopte une stratégie préventive et agressive de linting, il peut utiliser l'option --strict pour empêcher tout code non annoté. D'autre part, s’il travaille avec une base de code ancienne qui ne comporte pas beaucoup de définitions de type, il peut utiliser des options plus souples, comme l'option --disallow-untyped-defs pour empêcher uniquement les définitions de fonctions non typées tout en autorisant un autre code non typé. Et il peut toujours utiliser des commentaires en ligne comme # type : ignore pour éviter que des lignes individuelles ne soient signalées. Mypy peut utiliser les fichiers stub PEP 484 quand on souhaite utiliser des indications de type pour les interfaces publiques d'un module. De plus, Mypy propose stubgen, un outil qui génère automatiquement des fichiers stub à partir de code existant. Pour le code non typé, les fichiers stub utilisent des types génériques, que l’on peut ensuite baliser selon ses besoins.

 Mypy peut fonctionner de manière autonome. (Crédit Photo :DR)

Pytype

Créé par Google, Pytype est différent de Mypy par le fait qu’il utilise l'inférence au lieu de simples 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 fait preuve d'indulgence chaque fois que cela a un sens. Si une opération fonctionne à l'exécution sans contredire aucune annotation, Pytype s’en accommodera. Cela signifie cependant 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 inaperçus. La documentation indique que l’outil ne tolérera plus ce genre de choses dans de futures versions.

Si le développeur choisit d'ajouter des annotations de type à son code, la fonction reveal_type de Pytype s’avère particulièrement utile. S’il insère dans son code une déclaration du genre reveal_type(expr), Pytype évaluera expr et émettra une alerte qui décrit son type. A noter que certains comportements de Pytype sont contrôlés par l'ajout d'attributs au code lui-même. Par exemple, si l’on veut empêcher Pytype de signaler des attributs manquants ou des « module members » définis dynamiquement, il faut ajouter l'attribut _HAS_DYNAMIC_ATTRIBUTES = True à la classe ou au module concerné, et ne pas définir une sorte de métadonnée de configuration Pytype.

 Le correcteur de type par inférence de Google est plus souple que d'autres solutions. (Crédit Photo : DR)

Pyright / Pylance

Pyright est le vérificateur de type Python de Microsoft. Il est 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 : il suffit de l'installer et elle est prête à l’usage. Pyright offre une bonne expérience de la vérification de type et du linting de code, avec les mêmes commodités et avancées que les précédents outils d'analyse Python. Comme Pytype, Pyright peut fonctionner avec des bases de code n’ayant aucune information de type. Dans ce cas, Pyright fera de son mieux pour déduire les types impliqués. On peut donc toujours obtenir de bons résultats avec Pytype sur des bases de code plus anciennes sans déclaration de type. Et les résultats s’amélioreront dans le temps, à mesure de l’ajout d’annotations de type à son code.

Pyright est très flexible, et complète facilement les designs de projets Python du monde réel. Comme pour les autres types de vérificateurs, Pyright peut être configuré en fonction d’un projet à l’aide d’un fichier de configuration au format JSON placé 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 avoir leur propre configuration Pyright, si différentes parties du projet ont besoin de différentes configurations de linting. Dans le même esprit, le développeur peut définir plusieurs « environnements d'exécution » dans un projet, chacun avec ses propres chemins d'accès ou d'importation.

 Développé par Microsoft, Pyright se veut aussi très flexible. (Crédit Photo : DR)

Pyre

Créé par les développeurs de Facebook et Instagram, Pyre regroupe en fait deux outils en un : un vérificateur de type (Pyre) et un outil d'analyse de code statique (Pysa). Les deux outils sont conçus pour travailler main dans la main afin de fournir un niveau de vérification et d'analyse plus élevé que les autres outils, mais une intervention de l’utilisateur permet d’en tirer pleinement parti. Pyre adopte une approche similaire à celle de Pytype et Mypy. Le code non typé est traité avec plus d'indulgence que le code typé, de sorte que l’on peut démarrer avec un code Python non typé et ajouter des annotations fonction par fonction et module par module. En basculant sur le « mode strict » dans un module, Pyre signalera toute annotation manquante. On peut également définir le mode strict comme mode par défaut et le désactiver au niveau du module. Pyre fonctionne également avec les fichiers stub au format .pyi. Pyre dispose d'une fonction puissante de migration des bases de code vers un format typé. L'option de ligne de commande Infer ingère un fichier ou un répertoire, fait des suppositions éclairées sur les types utilisés, et applique les annotations aux fichiers. Mais il est nécessaire de faire au préalable des sauvegardes du code ! (Un autre projet Facebook/Instagram appelé MonkeyType permet d’obtenir des informations sur les types d'un programme Python en cours d'exécution).

Si les fonctionnalités de Pyre sont proches de celles des autres outils présentés ici, Pysa est unique : en effet, cet outil effectue une « analyse d'altération » du code pour identifier les éventuels problèmes de sécurité. Pour cela, Pysa s’appuie sur une bibliothèque d'analyses de flux de certains composants logiciels et signale le code qui lui paraît vulnérable. Tout ce qui est touché par ce code sera également marqué comme corrompu, mais le développeur peut spécifier des composants qui assainissent les données et suppriment ces données de la liste du code altéré. Il y a un inconvénient : la bibliothèque d'analyses de composants tiers de Pysa est encore restreinte, et le développeur devra peut-être concevoir son propre modèle. Mais beaucoup d'analyses d'altération sont destinées à des logiciels très répandus, comme le framework web Django, SQL Alchemy ORM et la bibliothèque de data science Pandas, sans parler des analyses pour les problèmes courants affectant les systèmes de fichiers.

 Facebook et Instagram ont crée Pyre regroupant deux outils. (Crédit Photo : DR)