PEP 484: Typhinweise wurde in Python 3.5 eingeführt. Weitere Informationen finden Sie unter Unterstützung für Hinweise zu offiziellen Dokumenttypen (https://docs.python.org/en/3/library/typing.html).
In letzter Zeit habe ich viele Geschichten gehört, die in der Community vorgestellt wurden. Ich möchte es auch in zukünftigen Projekten vorstellen und werde es hier als Referenz zusammenfassen, wenn ich mich selbst studiere und es anderen erkläre.
Typhinweise wurden in Python 3.5 und höher als Python-Syntax eingeführt.
installiere mypy
(env) $ pip install mypy
Fragen Sie bei mypy nach
(env) $Name des mypy-Moduls
Als Beispiel werden alle als Integer (Int) -Typ angezeigt.
a: int = 10
a: int
a = 10
def f(a: int):
pass
def f(a: int = 10):
pass
def f(a) -> int:
return 10
def f(a: int, b: int = 10) -> int:
return a + b
Name | Schimmel |
---|---|
ganze Zahl | int |
Gleitkommazahl | float |
String | str |
Bytetyp | bytes |
Wahrheitswert | bool |
None | None |
Da das Containersystem den Typ angibt, der eingeschlossen werden soll, möchte ich ihn als "list [int]" schreiben. Dies führt jedoch zu einem Python-Syntaxfehler. Aus diesem Grund wird beim Tippen eine spezielle Form vorbereitet.
from typing import List, Tuple, Dict, Set
Name | Schimmel | Definitionsbeispiel |
---|---|---|
aufführen | List | List[int] |
Taple | Tuple | Tuple[int, int] / Tuple[int, ...] |
Wörterbuch | Dict | Dict[str, int] |
einstellen | Set | Set[int] |
from typing import Any
Name | Schimmel | Definitionsbeispiel |
---|---|---|
Alles ist gut | Any | Any |
from typing import Callable, Iterator, MutableMapping
Name | Schimmel | Definitionsbeispiel |
---|---|---|
Abrufbar | Callable | Callable[[int, float], bool] |
Wiederholbar | Iterator | Iterator[int] |
Verhalten wie ein Wörterbuch | MutableMapping | MutableMapping[str, int] |
Optional
Optional ist ein Typ, der den angegebenen Typ oder Keine zulässt. Wenn Sie beispielsweise entweder Ganzzahlen oder Keine zulassen möchten, verwenden Sie "Optional [int]".
Es wird in den folgenden Fällen verwendet.
from typing import Optional
def f1(a: int, b: int) -> Optional[int]:
if b == 0:
return None
return a // b
Dies ist praktisch, da es wie folgt verwendet werden kann.
def f2(c: Optional[int]) -> int:
if c is None:
c = 0
return c + 100
Wenn Sie den obigen Fall wie folgt beschreiben, benachrichtigt Sie mypy über den Fehler.
def f2(c: Optional[int]) -> int:
return c + 100
$ mypy sample.py
sample.py:**: error: Unsupported operand types for + ("None" and "int")
sample.py:**: note: Left operand is of type "Optional[int]"
Found 1 error in 1 file (checked 1 source file)
Das heißt, indem wir "wenn c keine ist" tun, addieren wir die Zeit, wenn c keine ist, und in den nachfolgenden Zeilen die Variable c. Wird als ganzzahliger Typ (int) festgelegt, garantieren wir, dass er problemlos verarbeitet werden kann.
Union
Union kann einen von zwei Typen angeben. Wenn Sie beispielsweise Integer-Typ oder String-Typ sagen, geben Sie "Union [int, str]" an.
Wenn Sie ein Argument wie unten gezeigt erhalten, verwenden Sie es, wenn Sie nicht wissen, ob es sich um eine Ganzzahl oder eine Zeichenfolge handelt. Wenn Sie die Verarbeitung mit "isinstance" trennen, können Sie den Typ der Variablen wie oben unter "Optional" bestimmen. Ich kann es schaffen
from typing import Union
def f3(d: Union[int, str]) -> str:
if not isinstance(d, str):
d = str(d)
return d.upper()
Hier als wenn nicht isinstance (d, str):
, wenn die Variable d kein String-Typ (str) ist, wird der Prozess der Konvertierung in einen String eingefügt und der Prozess fortgesetzt. Da return d.upper ()
weiß, dass d
eine Zeichenfolge ist, können wir eine Methode vom Typ Zeichenfolge verwenden, um sie sicher in Großbuchstaben umzuwandeln.
Sie können keinen Float eingeben, indem Sie int angeben, aber Sie können einen int eingeben, indem Sie den entgegengesetzten Float angeben. In den folgenden Fällen gibt nur num4 einen Fehler aus.
num1: float = 1.0
num2: float = 1
num3: int = 1
num4: int = 1.0 #Dies führt zu einem Fehler
$ mypy sample/sample.py
sample.py:**: error: Incompatible types in assignment (expression has type "float", variable has type "int")
Dies scheint darauf zurückzuführen zu sein, dass int automatisch in float konvertiert werden kann. Wenn jedoch das entgegengesetzte float in int geändert wird, gehen möglicherweise Informationen verloren.
Recommended Posts