[PYTHON] Versuchen Sie es mit Hinweisen

Überblick

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.

Werkzeug

Mypy-Spickzettel

installiere mypy

(env) $ pip install mypy

Fragen Sie bei mypy nach

(env) $Name des mypy-Moduls

Beispiel für die Definition eines Hinweises

Als Beispiel werden alle als Integer (Int) -Typ angezeigt.

Variablendefinition


a: int = 10
a: int
a = 10

Definition von Funktionsargumenten

def f(a: int):
    pass

def f(a: int = 10):
    pass

Definition des Funktionsrückgabewerts


def f(a) -> int:
    return 10

def f(a: int, b: int = 10) -> int:
    return a + b

Typdefinition

Definiert nach Datentyp

Name Schimmel
ganze Zahl int
Gleitkommazahl float
String str
Bytetyp bytes
Wahrheitswert bool
None None

Containersystem

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]

Spezieller Typ

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]

Andere

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.

int und float

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

Versuchen Sie es mit Hinweisen
[Übersetzung] PEP 0484 --Tipps
Trainieren! !! Einführung in Python Type (Type Hints)
Erhöhen Sie die Sichtbarkeit der Quelle mit Typhinweisen
Shell-Typ
Wörterbuchtyp 2
Wörterbuchtyp 1
versuchen Sie es mit pysdl2
Versuchen Sie PyOpenGL
Möchten Sie Python-Dekoratoren Typhinweise hinzufügen?