4 Python-Typprüfungen, um Ihren Code sauber zu halten

Am Anfang hatte Python keine Schriftdekorationen. Dies passt zum allgemeinen Ziel, die Sprache schnell und einfach zu bearbeiten, mit flexiblen Objekttypen, die den Drehungen und Wendungen beim Schreiben von Code Rechnung tragen und Entwicklern helfen, ihren Code präzise zu halten.

In den letzten Jahren hat Python jedoch Unterstützung für Typanmerkungen hinzugefügt, was eine ganze Kultur von Software inspiriert, die sich der Typprüfung von Python während der Entwicklung widmet. Python überprüft zur Laufzeit keine Typen - zumindest noch nicht. Wenn Sie jedoch einen guten Typprüfer nutzen und mit einer Schrotflinte in der IDE Ihrer Wahl fahren, können Sie die Typanmerkungen von Python verwenden, um viele häufige Fehler auszusortieren, bevor sie in die Produktion gelangen.

In diesem Artikel werden wir uns mit vier der wichtigsten Add-Ons zur Typprüfung für Python befassen. Alle folgen ungefähr dem gleichen Muster, scannen Python-Code mit Typanmerkungen und geben Feedback. Aber jeder bietet seine eigenen nützlichen Ergänzungen zum Grundkonzept.

Mypy

Mypy war wohl das erste statische Typprüfungssystem für Python, als die Arbeiten 2012 begannen, und es befindet sich noch in der aktiven Entwicklung. Es ist im Wesentlichen der Prototyp für die Funktionsweise von Typprüfungsbibliotheken von Drittanbietern in Python, auch wenn seitdem viele andere hinzugekommen sind und die Funktionen erweitert haben.

Mypy kann eigenständig oder über die Befehlszeile ausgeführt werden oder als Teil eines Editors oder der Linter-Integration von IDE verwendet werden. Viele Editoren und IDEs integrieren Mypy. Die Python-Erweiterung von Visual Studio Code kann direkt damit arbeiten. Bei der Ausführung generiert Mypy Berichte über die Konsistenz Ihres Codes basierend auf den bereitgestellten Typinformationen.

Wenn Ihr Code keine Typanmerkungen enthält, führt Mypy die überwiegende Mehrheit seiner Codeprüfungen nicht durch. Sie können jedoch Mypy verwenden, um nicht kommentierten Code zu kennzeichnen. Dies kann je nach Bedarf mit unterschiedlicher Strenge erfolgen.

Wenn Sie mit einer Codebasis von vorne anfangen und eine präventiv aggressive Flusenstrategie wünschen, können Sie die --strictOption verwenden, um untypisierten Code zu verhindern. Wenn Sie jedoch mit einer älteren Codebasis arbeiten, die nicht viele Typdefinitionen enthält, können Sie entspanntere Optionen verwenden, z. B. nur untypisierte Funktionsdefinitionen verhindern,  --disallow-untyped-defs während Sie anderen untypisierten Code zulassen. Und Sie können immer Inline-Kommentare verwenden # type: ignore, um zu verhindern, dass einzelne Zeilen markiert werden.

Mypy kann PEP 484-Stub-Dateien verwenden, wenn Sie Typhinweise für die öffentlichen Schnittstellen eines Moduls verwenden möchten. Darüber hinaus bietet Mypy stubgenein Tool an, das automatisch Stub-Dateien aus vorhandenem Code generiert. Für untypisierten Code verwenden die Stub-Dateien generische Typen, die Sie dann nach Bedarf markieren können.

Pytype

Der von Google erstellte Pytype unterscheidet sich von Mypy darin, dass er Inferenz anstelle von Typdeskriptoren verwendet. Mit anderen Worten, Pytype versucht, Typen durch Analyse des Codeflusses zu bestimmen, anstatt sich ausschließlich auf Typanmerkungen zu verlassen.

Pytype irrt auf der Seite der Nachsicht, wann immer es sinnvoll ist, dies zu tun. Wenn Sie eine Operation haben, die zur Laufzeit funktioniert und keinen Anmerkungen widerspricht, wird Pytype nicht darüber kreischen. Dies bedeutet jedoch, dass einige Probleme, die gekennzeichnet werden sollten (z. B. das Deklarieren einer Variablen mit einem Typ an einem Punkt und das anschließende Neudefinieren im selben Kontext), unangekündigt auftreten. Die Dokumentation besagt, dass solche Dinge zu einem späteren Zeitpunkt nicht mehr zugelassen werden.

Wenn Sie Ihrem Code Typanmerkungen hinzufügen möchten, ist die reveal_typeFunktion von Pytype  besonders praktisch. Wenn Sie eine Anweisung in Ihren Code einfügen, die lautet reveal_type(expr), wertet Pytype expreine Warnung aus und gibt sie aus, die den Typ beschreibt. 

Beachten Sie, dass bestimmte Pytype-Verhaltensweisen durch Hinzufügen von Attributen zum Code selbst gesteuert werden. Wenn Sie beispielsweise verhindern möchten, dass sich Pytype über fehlende Attribute oder Modulmitglieder beschwert, die dynamisch festgelegt werden, müssen Sie das Attribut _HAS_DYNAMIC_ATTRIBUTES = Trueder betreffenden Klasse oder dem betreffenden Modul hinzufügen , anstatt eine Art von Pytype-Konfigurationsmetadaten festzulegen.

Pyright / Pylance

Pyright ist die Python-Typprüfung von Microsoft, die als Teil der Pylance-Erweiterung für Visual Studio-Code enthalten ist. Wenn Sie bereits VS Code-Benutzer sind, ist die Pylance-Erweiterung die bequemste Möglichkeit, mit Pyright zu arbeiten. Einfach installieren und loslegen. Pyright bietet eine gute All-in-One-Erfahrung in Bezug auf Typprüfung und Code-Flusen mit vielen der gleichen Annehmlichkeiten und Fortschritte wie frühere Python-Analysetools.

Wie Pytype kann Pyright mit Codebasen arbeiten, die keine Typinformationen enthalten. In diesen Fällen wird Pyright sein Bestes tun, um zu schließen, welche Typen im Spiel sind. Somit können Sie mit Pytype auf älteren Codebasen ohne Typdeklarationen immer noch gute Ergebnisse erzielen. Mit der Zeit erzielen Sie jedoch bessere Ergebnisse, wenn Sie Ihrem Code schrittweise Typanmerkungen hinzufügen.

Pyright ist in einer Weise sehr flexibel, die das Design realer Python-Projekte ergänzt. Wie bei anderen Typprüfungen kann Pyright pro Projekt mit einer JSON-formatierten Konfigurationsdatei im Projektverzeichnis konfiguriert werden. Einzelne Pfade können in der Konfigurationsdatei ausgeschlossen (nie überprüft) oder ignoriert (Fehler und Warnungen unterdrückt) werden, und die Optionen sind sehr detailliert.

In VS Code können Arbeitsbereiche mit mehreren Wurzeln jeweils eine eigene Pyright-Konfiguration haben, falls verschiedene Teile des Projekts unterschiedliche Flusenkonfigurationen benötigen. Auf die gleiche Weise können Sie innerhalb eines Projekts mehrere „Ausführungsumgebungen“ definieren, von denen jede ihre eigenen Venv- oder Importpfade hat.

Scheiterhaufen 

Pyre wurde von Entwicklern auf Facebook und Instagram entwickelt und besteht eigentlich aus zwei Tools in einem: einem Typprüfer (Pyre) und einem statischen Code-Analyse-Tool (Pysa). Die beiden arbeiten Hand in Hand, um ein höheres Maß an Überprüfung und Analyse zu bieten als andere Tools, obwohl der Benutzer ein wenig schweres Heben ausführen muss, um sie voll ausnutzen zu können.

Pyre verfolgt einen ähnlichen Ansatz wie Pytype und Mypy. Nicht typisierter Code wird milder behandelt als typisierter Code. Sie können also mit einer untypisierten Python-Codebasis beginnen und Anmerkungen Funktion für Funktion und Modul für Modul hinzufügen. Wenn Sie in einem Modul den „strengen Modus“ aktivieren, markiert Pyre fehlende Anmerkungen. Oder Sie können den strengen Modus als Standard festlegen und auf Modulebene deaktivieren. Pyre funktioniert auch mit Stub-Dateien im Pyi-Format.

Pyre verfügt über eine leistungsstarke Funktion zum Migrieren von Codebasen in ein typisiertes Format. Die inferBefehlszeilenoption nimmt eine Datei oder ein Verzeichnis auf, errät fundierte Vermutungen zu den verwendeten Typen und wendet die Anmerkungen auf die Dateien an. Sie sollten jedoch zuerst Backups Ihres Codes erstellen! (Wenn Sie Typinformationen von einem laufenden Python-Programm erhalten möchten , können Sie dies mit einem anderen Facebook / Instagram-Projekt, MonkeyType, tun.)

Während die Funktionen von Pyre denen der anderen hier beschriebenen Pakete entsprechen, ist Pysa einzigartig. Pysa führt eine „Verschmutzungsanalyse“ des Codes durch, um potenzielle Sicherheitsprobleme zu identifizieren. Dabei wird auf eine Bibliothek mit Flussanalysen für bestimmte Softwarekomponenten zurückgegriffen und Code markiert, der anfällig zu sein scheint. Alles, was von diesem Code berührt wird, wird ebenfalls als fehlerhaft gekennzeichnet. Sie können jedoch Komponenten angeben, die Daten bereinigen und diese Daten aus dem fehlerhaften Diagramm entfernen.

Ein Nachteil ist, dass Pysas Bibliothek mit Komponenten-Taint-Analysen von Drittanbietern noch klein ist. Daher müssen Sie möglicherweise Ihr eigenes Modell entwickeln. Viele der Taint-Analysen beziehen sich jedoch auf weit verbreitete Software, wie das Django-Webframework, das SQL Alchemy ORM und die Pandas Data Science-Bibliothek, ganz zu schweigen von Analysen für häufig auftretende Dateisystemprobleme.

Wie man mehr mit Python macht

  • So arbeiten Sie mit dem Datentyp der Python-Liste
  • So verpacken Sie Python-Apps mit BeeWare Briefcase
  • Wie man Anaconda neben anderen Pythons laufen lässt
  • Verwendung von Python-Datenklassen
  • Beginnen Sie mit Async in Python
  • So verwenden Sie Asyncio in Python
  • 3 Schritte zu einer asynchronen Python-Überholung
  • Verwendung von PyInstaller zum Erstellen von ausführbaren Python-Dateien
  • Cython-Tutorial: So beschleunigen Sie Python
  • So installieren Sie Python auf intelligente Weise
  • So verwalten Sie Python-Projekte mit Poetry
  • So verwalten Sie Python-Projekte mit Pipenv
  • Virtualenv und venv: Erklärte virtuelle Python-Umgebungen
  • Python virtualenv und venv tun und nicht tun
  • Python-Threading und Unterprozesse erklärt
  • Verwendung des Python-Debuggers
  • Verwendung von timeit zum Profilieren von Python-Code
  • Verwendung von cProfile zum Profilieren von Python-Code
  • So konvertieren Sie Python in JavaScript (und wieder zurück)