2017-02-25 7 views
1

Ich versuche zu verstehen, warum ich Typen Anmerkung in Python verwenden soll. Für exemple kann ich schreiben Funktion wie:Warum Typen in Python verwenden 3.5 +

def some_function(a: int, b: int) -> int: 
    return a + b 

Wenn ich es mit int alles gut gegangen:

some_function(1, 2) # return 3, type int 

Aber wenn ich für exemple laufen

some_function(1, 2.0) # return 3.0, type float 

Ich habe Ergebnis ohne stellt fest, dass Typen falsch sind. Also, was ist der Grund, Typen Annotation zu verwenden?

+0

Typhinweise werden zur Laufzeit nicht erzwungen. Führen Sie 'mypy' auf Ihrem Projekt aus, um zu erfahren, dass Sie' some_function() 'falsch verwenden. –

+0

IDE-Unterstützung .... –

Antwort

3

Typ Hinweise gibt es für andere Werkzeuge, um Ihren Code zu überprüfen, sie werden zur Laufzeit nicht erzwungen. Das Ziel ist, statische Analysewerkzeuge zu aktivieren, um die Verwendung ungültiger Argumente zu erkennen.

Verwenden Sie eine IDE wie PyCharm oder die commandline code checker mypy, um zu erfahren, dass 2.0 kein gültiger Argumenttyp ist.

Vom Type Hinting PEP (484):

Dieser PEP eine Standardsyntax für Typenannotationen bieten soll, Python-Code einfacher statische Analyse öffnen und Refactoring, mögliche Laufzeittypprüfung und (vielleicht in einigen Kontexte) Codegenerierung unter Verwendung von Typinformation.

Schwerpunkt meiner. Die Überprüfung des Laufzeittyps wird Tools von Drittanbietern überlassen. Beachten Sie, dass solche Laufzeitprüfungen mit einer Leistungseinbuße einhergehen. Ihr Code wird wahrscheinlich langsamer laufen, wenn Sie bei jedem Aufruf nach Typen suchen.

+0

Vielen Dank für die Antwort. Nur eine Ergänzung, ist es eine gute Übung, es im Code zu verwenden? –

+0

@OleksandrDashkov: absolut! Wir nutzen es auf Facebook, um das Arbeiten in großen Projekten zu erleichtern und Fehler zu reduzieren. –

+0

Schnelle Frage, liefern Sie sie über Stubs oder fügen Sie sie direkt in den Quelldateien hinzu? –

1

Wie kann man in dem PEP 484 that introduces type hints lesen:

(...)

Dieser PEP eine Standardsyntax für Typenannotationen bieten soll, Öffnung Python-Code einfacher statischen Analyse und Refactoring, potenzielle Laufzeittyp Überprüfung, und (vielleicht in einigen Zusammenhängen) Code Generation mit Typ Informationen.

Von diesen Zielen ist die statische Analyse am wichtigsten. Dazu gehören Unterstützung für off-line-Typ Kontrolleure wie mypy sowie eine Standardnotation, vorausgesetzt durch IDEs für Code-Vervollständigung und refactoring verwendet werden kann.

IDE (statische Analyse)

So ist die hauptsächliche Verwendung in statische Analyse: Ihre IDE, dass etwas erkennen kann, ist falsch, wenn Sie eine Funktion aufrufen und eine Liste von Funktionen zur Verfügung stellen können Sie anrufen können das Ergebnis der Funktion.wenn

Zum Beispiel schreiben Sie:

some_function(1,2). 

IDE eine Liste mit real als eine mögliche Option zur Verfügung stellen kann, so können Sie ganz einfach schreiben:

some_function(1,2).real 

und wenn Sie schreiben:

some_function('foo',2).bar 

Es wird darauf hingewiesen, dass ist kein akzeptabler Parameter noch ist .bar ein guter Aufruf für dieses Objekt.

Dynamische Inspektion

Sie können es auch für die dynamische Prüfung verwenden mit inspect.getfulargspec wie:

>>> import inspect 
>>> inspect.getfullargspec(some_function).annotations 
{'return': <class 'int'>, 'a': <class 'int'>, 'b': <class 'int'>} 

Jetzt wissen wir, dass some_function eine int zurück und kann zwei int s feeded werden. Dies kann für beliebige Tests verwendet werden (die in Haskell beliebt sind): Sie füttern einfach die some_function zufällige Ganzzahlen und sieht, dass es immer eine int zurückgibt (und löst keine Ausnahme zum Beispiel).