Heim >Backend-Entwicklung >Python-Tutorial >Eine ausführliche Einführung in die Typprüfung in Python
Vorwort
Jeder weiß, dass Python eine stark typisierte, dynamische Typprüfungssprache ist. Der sogenannte dynamische Typ bedeutet, dass wir beim Definieren einer Variablen den Typ der Variablen nicht angeben müssen. Der Python-Interpreter prüft ihn automatisch zur Laufzeit.
Im Vergleich zu statisch typisierten Sprachen (wie C) geht es hier nicht nur darum, ein paar weniger Typdeklarationszeichen zu schreiben:
#include <stdlib.h> #include <stdio.h> #define BUFF 100 char* greeting(char* name){ char* msg = (char *) malloc(sizeof(char) * BUFF); sprintf(msg, "Hello, %s!", name); return msg; } int main(){ printf("Greeting: <%s>\n", greeting("C99")); return 0; }
def greeting(name): return "Hello, {}!".format(name) def main(): print("Greeting: <%s>" % greeting("Python35")) if __name__ == '__main__': main()
Dynamisches Tippen befreit unser Denken bis zu einem gewissen Grad von der Simulation der Computerarbeit, sodass wir uns mehr auf die Probleme konzentrieren können, die gelöst werden müssen: Genau wie Im obigen Beispiel müssen wir nicht über die von der Begrüßungsfunktion akzeptierten Parametertypen und den Typ des Rückgabewerts nachdenken, sondern müssen nur die Funktionen berücksichtigen, die die Begrüßungsfunktion implementieren muss.
Das bedeutet natürlich nicht, dass dynamische Typen unbedingt besser sind als statische Typen. Es ist unfair, das obige Beispiel mit der Sprache C und Python zu vergleichen:
package main import "fmt" func greeting(name string) string { return fmt.Sprintf("Hello, %s", name) } func main() { fmt.Printf("Greeting: <%s>", greeting("Go")) }
Der Vorteil (und teilweise auch Nachteil) der statischen Typisierung besteht darin, dass beim Definieren einer Methode ein obligatorisches Protokoll (Schnittstelle) formuliert wird und dies nur durch Befolgen des Protokolls möglich ist richtig eingesetzt werden. Dies ist sehr hilfreich für die Zusammenarbeit mehrerer Personen, die Entwicklung von Bibliotheken von Drittanbietern, das schnelle Auffinden von Fehlern usw. Ein weiterer großer Vorteil der statischen Typisierung besteht darin, dass die IDE dabei helfen kann, die Schnittstellennutzung und Typprüfung zu beschleunigen und so die Effizienz weiter zu verbessern. Da es so viele Vorteile gibt, sollte man auch Python lernen? Tatsächlich hat PEP 484 in Python 3.5 bzw. PEP 526 in Python 3.6 die Syntax von Typhinweisen hinzugefügt. Bei PEP 484 geht es hauptsächlich um die Typdeklarationssyntax von Parametern und Rückgabewerten von Funktionen, Methoden, Klassen usw PEP 526 fügt die Deklaration des Variablentyps hinzu:
def greeting(name: str) -> str: return "Hello, {}!".format(name)
Mypy
Mypy ist offiziell empfohlen statische Typprüfungstools:
python3 -m pip install mypy
Sie können den Befehl mypy verwenden, um Python-Programme direkt zu überprüfen:
mypy greeting.py
Zur Vereinfachung können Sie es auf die IDE anwenden. Am Beispiel von Atom können Sie das Plug-in linter-mypy installieren:
python3 -m pip install typed-ast apm install linter apm install linter-mypy
Die von Mypy unterstützten gängigen Typen sind in der folgenden Tabelle aufgeführt (aus der offiziellen Dokumentation):
wobei List/Dict/Iterable/Sequence/Any aus der Standardbibliothekstypisierung stammt. Sequence und Iterable entsprechen hier jeweils collections.abc.Sequence
und collections.abc.Iterable
. Zur einfachen Unterscheidung kann Sequence durch einen numerischen Index indiziert werden, während Iterable den Generator darstellen kann:
Python 2.x
Code mit hinzugefügten Typanmerkungen kann direkt über den Python 3.5-Interpreter ausgeführt werden, ist jedoch völlig inkompatibel mit Python 2.x. Wenn Sie es in Python 2.x verwenden möchten, müssen Sie zunächst die Eingabe installieren:
pip install typing
Dann können Sie es zwangsweise in das Formular einfügen eines einzeiligen Kommentars:
def send_email(address, # type: Union[str, List[str]] sender, # type: str cc, # type: Optional[List[str]] bcc, # type: Optional[List[str]] subject='', body=None # type: List[str] ): # type: (...) -> bool """Send an email message. Return True if successful.""" pass
Eine ausführlichere Einführung in die Typprüfung in Python und verwandte Artikel finden Sie auf der chinesischen PHP-Website!