Die anderen Antworten haben gut erklärt, wie man Enten tippt und die einfache Antwort von tzot :
In Python gibt es keine Variablen wie in anderen Sprachen, wo Variablen einen Typ und einen Wert haben, sondern Namen, die auf Objekte zeigen, die ihren Typ kennen.
Allerdings Seit 2010 (als die Frage zum ersten Mal gestellt wurde) hat sich eine interessante Sache geändert, nämlich die Einführung von PEP 3107 (implementiert in Python 3). Sie können nun tatsächlich den Typ eines Parameters und den Typ des Rückgabetyps einer Funktion wie folgt angeben:
def pick(l: list, index: int) -> int:
return l[index]
Hier können wir sehen, dass pick
benötigt 2 Parameter, eine Liste l
und eine ganze Zahl index
. Sie sollte auch eine ganze Zahl zurückgeben.
Hier wird also impliziert, dass l
ist eine Liste von ganzen Zahlen, die wir ohne großen Aufwand sehen können, aber bei komplexeren Funktionen kann es etwas verwirrend sein, was die Liste enthalten soll. Wir wollen auch den Standardwert von index
0 sein. Um dieses Problem zu lösen, können Sie schreiben pick
stattdessen so:
def pick(l: "list of ints", index: int = 0) -> int:
return l[index]
Beachten Sie, dass wir jetzt einen String als Typ von l
was zwar syntaktisch zulässig ist, sich aber nicht gut für das programmatische Parsing eignet (worauf wir später zurückkommen).
Es ist wichtig zu beachten, dass Python keine Fehlermeldung auslöst. TypeError
wenn Sie einen Float in index
Der Grund dafür ist einer der wichtigsten Punkte in der Designphilosophie von Python: "Wir sind hier alle mündige Erwachsene" Das bedeutet, dass Sie wissen müssen, was Sie an eine Funktion übergeben können und was nicht. Wenn Sie wirklich Code schreiben wollen, der TypeErrors auslöst, können Sie die isinstance
Funktion, um zu prüfen, ob das übergebene Argument vom richtigen Typ oder einer Unterklasse davon ist, wie hier:
def pick(l: list, index: int = 0) -> int:
if not isinstance(l, list):
raise TypeError
return l[index]
Warum Sie dies selten tun sollten und was Sie stattdessen tun sollten, erfahren Sie im nächsten Abschnitt und in den Kommentaren.
PEP 3107 verbessert nicht nur die Lesbarkeit des Codes, sondern hat auch einige passende Anwendungsfälle, über die Sie hier lesen können ici .
Die Typ-Annotation hat in Python 3.5 mit der Einführung von PEP 484 das ein Standardmodul einführt typing
für Typ-Hinweise.
Diese Typ-Hinweise stammen von der Typüberprüfung mypy ( GitHub ), die jetzt PEP 484 willfährig.
En typing
Modul kommt mit einer ziemlich umfassenden Sammlung von Typ-Hinweisen, einschließlich:
List
, Tuple
, Set
, Dict
- für list
, tuple
, set
y dict
beziehungsweise.
Iterable
- nützlich für Generatoren.
Any
- obwohl es alles Mögliche sein könnte.
Union
- wenn es sich um einen beliebigen Typ innerhalb einer bestimmten Gruppe von Typen handeln kann, im Gegensatz zu Any
.
Optional
- wenn es könnte keine sein. Kurzform für Union[T, None]
.
TypeVar
- mit Generika verwendet.
Callable
- wird in erster Linie für Funktionen verwendet, kann aber auch für andere Callables verwendet werden.
Dies sind die gebräuchlichsten Typenhinweise. Eine vollständige Liste finden Sie in der Dokumentation für das Typisierungsmodul .
Hier ist das alte Beispiel, das die im Typisierungsmodul eingeführten Anmerkungsmethoden verwendet:
from typing import List
def pick(l: List[int], index: int) -> int:
return l[index]
Eine leistungsstarke Funktion ist die Callable
die es Ihnen ermöglicht, Methoden, die eine Funktion als Argument annehmen, mit Anmerkungen zu versehen. Zum Beispiel:
from typing import Callable, Any, Iterable
def imap(f: Callable[[Any], Any], l: Iterable[Any]) -> List[Any]:
"""An immediate version of map, don't pass it any infinite iterables!"""
return list(map(f, l))
Das obige Beispiel könnte durch die Verwendung von TypeVar
代わりに Any
Aber das ist eine Übung für den Leser, denn ich glaube, ich habe meine Antwort schon mit zu vielen Informationen über die wunderbaren neuen Funktionen der Tipphilfe gefüllt.
Wenn man früher Python-Code dokumentiert hat, zum Beispiel mit Sphinx einige der oben genannten Funktionen könnten durch das Schreiben von Dokumentationsstrings, die wie folgt formatiert sind, erreicht werden:
def pick(l, index):
"""
:param l: list of integers
:type l: list
:param index: index at which to pick an integer from *l*
:type index: int
:returns: integer at *index* in *l*
:rtype: int
"""
return l[index]
Wie Sie sehen, sind dafür eine Reihe zusätzlicher Zeilen erforderlich (die genaue Anzahl hängt davon ab, wie explizit Sie sein wollen und wie Sie Ihren Docstring formatieren). Aber es sollte Ihnen nun klar sein, wie PEP 3107 bietet eine Alternative, die in vieler (aller?) Hinsicht überlegen ist. Dies gilt insbesondere in Kombination mit PEP 484 das, wie wir gesehen haben, ein Standardmodul bereitstellt, das eine Syntax für diese Typ-Hinweise/Anmerkungen definiert, die so verwendet werden kann, dass sie eindeutig und präzise, aber dennoch flexibel ist, was eine leistungsstarke Kombination ergibt.
Meiner persönlichen Meinung nach ist dies eine der besten Funktionen in Python überhaupt. Ich kann es kaum erwarten, dass die Leute anfangen, die Möglichkeiten dieser Funktion zu nutzen. Entschuldigung für die lange Antwort, aber das passiert, wenn ich mich aufrege.
Ein Beispiel für Python-Code, der stark auf Type Hinting zurückgreift, finden Sie hier ici .