Trainieren! !! Einführung in Python Type (Type Hints)

Einführung

Verwendet ihr Pythons Typhinweise? Da Python eine dynamisch typisierte Sprache ist, kann es für einige Benutzer von Vorteil sein, ohne explizite Typinformationen codieren zu können. Diese Meinung ist gültig, aber ich denke, es ist auch wahr, dass es durch explizite Angabe des Typs möglich ist, Code zu erstellen, der weniger anfällig für Fehler ist. Dieser Artikel befasst sich mit der Einführung in Zwischeninhalte zu Python-Typen. Ich hoffe, es hilft Ihnen, Ihre Python-Fähigkeiten zu verbessern.

Vorsichtsmaßnahmen

Für die statische Typanalyse von Python ist eine Bibliothek namens mypy erforderlich, aber ich werde nicht erklären, wie mypy verwendet und wie es installiert wird.

Schritt 1: Grundvariablentyp [unveränderlich]

Das Schreiben des Variablentyps ist wie folgt.

<Variablennamen>:<Schimmel>
<Variablennamen>:<Schimmel> = <Ursprünglicher Wert>

Wenn Sie es tatsächlich verwenden, wird es wie folgt sein.

test: int = 12
test2: bool = True
test3: str = 'Hello'
test4: float = 1.12

test = 'hello'  #Ich erhalte einen Mypy-Fehler

Ich habe eine Variable namens test in int definiert, aber wenn ich versuche, eine Zeichenfolge zuzuweisen, wird ein mypy-Fehler angezeigt. ** Ich erhalte einen Mypy-Fehler, aber der Code selbst läuft einwandfrei. ** **.

Schritt 2: Grundvariablentyp [Mutable]

Schauen wir uns als nächstes Wörterbücher und Array-Typen an.

test5: list = [1, 2, 3]
test6: dict = {'name': 'taro'}

test5 = 12 #Ich erhalte einen Mypy-Fehler
test6 = 'Name' #Ich erhalte einen Mypy-Fehler

Ich habe test5 als Array und test6 als Wörterbuch definiert. Wenn ich also versuche, einen anderen Wert zuzuweisen, wird ein mypy-Fehler angezeigt. Die obige Typdefinition ist in Ordnung, wir empfehlen jedoch, die Typliste und das Diktat für Arrays und Wörterbücher zu verwenden.

from typing import List, Dict

test7: List[int] = [1, 2, 3] #Kann nur auf int-Sequenzen eingegrenzt werden
test8: Dict[str, str] = {'name': 'taro'} #Sie können die Schlüssel und Werte des Wörterbuchs auf str einschränken

Für test5 und test6 können Sie den Typ nur als Array oder Wörterbuch definieren. Im Fall von test7 und test8 ist es jedoch möglich, detailliertere Typen wie ein Array von Ints und ein Wörterbuch mit Schlüsseln und Werten von str anzugeben. Grundsätzlich empfehlen wir dies.

Schritt 3: Wenn Sie mehrere Typen zulassen

Ich denke, es gibt viele Situationen, in denen Sie int und str für eine Variable zulassen möchten. Verwenden Sie in diesem Fall Union.

from typing import Union

test9: Union[int, str] = 10 #Erlaube int und str
test9 = 'Name' # OK
test9 = bool #Ich erhalte einen Mypy-Fehler

Ich habe test9 als eine Variable definiert, die int und str zulässt, daher erhalte ich einen mypy-Fehler, wenn ich versuche, den Wert von bool zuzuweisen.

Schritt 4: Funktionstyp

Grundform

Die Grundform des Funktionstyps ist wie folgt.

def <Funktionsname>(<Variablennamen>:<Schimmel>) -><戻り値のSchimmel>:
    ...

Wenn Sie es tatsächlich verwenden, wird es wie folgt sein.

def add(x: int, y: int) -> int:
    return x + y

[Tipps] Verwenden Sie float anstelle von Union [int, float], wenn sowohl int als auch float erwartet werden.

Tatsächlich tritt ein mypy-Fehler nicht auf, selbst wenn Sie der durch float definierten Variablen den Wert von int oder die Variable zuweisen. Sie können es mit Union [int, float] definieren, es wird jedoch empfohlen, es mit float zu definieren, da der Code sauberer ist.

#Wenn erwartet wird, dass eine Variable sowohl int als auch float enthält, geben Sie sie mit float ein
def add(x: float, y: float) -> float:
    return x + y

a: int = 1
add(a, 2) # OK

Für Funktionen ohne Rückgabewert

Oft gibt es keinen Rückgabewert für die Funktion. Setzen Sie in diesem Fall den Rückgabetyp auf Keine.

def log_print(number: int) -> None:
    print('Wert ist{}ist'.format(number))

b = log_print(12) # mypy error

Wenn Sie versuchen, der Variablen b den Rückgabewert einer Funktion zuzuweisen, die keinen Rückgabewert hat, wird ein mypy-Fehler angezeigt.

Schritt 5: Verwenden Sie Optional, wenn Keine zulässig ist

Wenn Sie die get-Methode für ein Wörterbuch verwenden, wird der entsprechende Wert zurückgegeben, wenn der Schlüssel im Wörterbuch vorhanden ist, oder None, wenn der Schlüssel nicht vorhanden ist. In diesem Fall können Sie einen Typ definieren, der den Wert + Keine in Union zulässt. Sie können jedoch Optional verwenden, um den Code sauber zu schreiben.

from typing import Optional

test10: Dict[str, str] = {'name': 'taro'}
test11: Optional[str] = test10.get('name') # str+Keine zulassen
test11 = test10.get('age') #Keine kehrt zurück

Im obigen Fall kann test11 als ein Typ definiert werden, der str und None zulässt.

Schritt 6: Definieren Sie einen detaillierteren Wörterbuchtyp [TypedDict]

Ich denke, dass der Wörterbuchtyp oft beim Codieren verwendet wird. Ich habe bereits erwähnt, dass Sie die Eingabe von Dict verwenden können, um Schlüssel- und Werttypen detaillierter einzugrenzen, aber Sie können sie detaillierter eingrenzen.

from typing import TypedDict

Movie = TypedDict('Movie', {'name': str, 'year': int})

movie: Movie = {'name': 'Blade Runner', 'year': 1982}
movie['age'] = 10  # mypy error
print(movie.get('author'))  # mypy error

Durch Schreiben wie oben ist es möglich, den Typ zu definieren, bei dem Movie den Schlüsselwert name von str und year den Schlüsselwert int hat. Wenn Sie versuchen, Daten mit einem undefinierten Schlüssel hinzuzufügen oder zu referenzieren, wird natürlich ein mypy-Fehler angezeigt.

Schritt 7: Definition des Klassentyps

Es gibt bisher nichts weiter als die Erklärung für den Unterricht. Es ist möglich, Elementvariablen und Elementfunktionen einzugeben.

from dataclasses import dataclass

@dataclass
class Student:
    name: str
    student_number: str

    def print_information(self) -> None:
        print('Name: {}, Student Number: {}'.format(self.name, self.student_number))


taro = Student('taro', '1234')
taro.print_information()
print(taro.age)  # mypy error

Der obige Code führt natürlich zu einem Fehler, da in der Student-Klasse keine Mitgliedsvariable namens age definiert ist.

Schritt 8: Über alle

Wenn Any hinzugefügt wird, wird die Typkonsistenz ignoriert.

from typing import Any

#Kann als Variable definiert werden, die einen beliebigen Typ akzeptiert, indem Any hinzugefügt wird
test12: Any = {'name': 'taro', 'age': 12} 
test12 = 'Hello' # No mypy Error

Mit Any können Sie dieser Variablen nicht nur einen beliebigen Wert zuweisen, sondern er kann auch in vielen Situationen schädlich sein.

from typing import Any
test13: int = 10
test13 = test12  #Mit Any definierte Variablen können jeder Variablen zugewiesen werden

def sub(x: float, y: float) -> float:
    return x - y

test14: Any = 'Hello'
sub(test14, 12.1)  #Ermöglicht eine Zeichenfolge, obwohl sie keine Zeichenfolge enthalten sollte

Wenn Sie eine Variable mit Any definieren, wird beim Zuweisen dieser Variablen zu einer anderen Variablen die Typprüfung ignoriert, z. B. wenn Sie sie als Argument einer Funktion verwenden. Daher ist die Verwendung von Any strengstens untersagt, da dies zu unerwartetem Verhalten führen kann. Ich denke, es ist besser, keine Typdefinition zu schreiben, als Any zu verwenden.

Bonus: Geben Sie einen Alias ein

Es wird selten verwendet, aber es ist möglich, dem Typ einen Alias zu geben.

#Geben Sie dem Typ einen Alias
UserData = Dict[str, Union[str, List[Dict[str, str]]]]

hanako: UserData = {
    'user-id': '1234',
    'belongings': [{'id': '12', 'name': 'PC'}, {'id': '23', 'name': 'Tablet'}],
}

Schließlich

Dieser Artikel befasst sich mit grundlegenden bis mittleren Inhalten. Neben den Inhalten, die in dieser Zeit behandelt werden, gibt es schwierigere Inhalte, aber ich denke, dass die Inhalte, die in dieser Zeit behandelt werden, beim normalen Codieren nicht ausreichen. In Bezug auf Python-Typen ist die Referenz von mypy detailliert und leicht zu verstehen, daher denke ich, dass es gut wäre, darauf zu verweisen. mypy Type hints cheat sheet Ich hoffe es hilft deiner Codierung noch ein wenig. Dann (* ^ ▽ ^ *)

Recommended Posts

Trainieren! !! Einführung in Python Type (Type Hints)
[Einführung in die Udemy Python3 + -Anwendung] 28. Kollektiver Typ
[Einführung in die Udemy Python3 + -Anwendung] 21. Taple-Typ
[Einführung in die Udemy Python3 + -Anwendung] 24. Wörterbuchtyp
[Einführung in die Udemy Python3 + -Anwendung] 16. Listentyp
Einführung in die Python-Sprache
Einführung in OpenCV (Python) - (2)
Möchten Sie Python-Dekoratoren Typhinweise hinzufügen?
Einführung in Python Django (2) Win
Einführung in die serielle Kommunikation [Python]
[Einführung in Python] <Liste> [Bearbeiten: 22.02.2020]
Einführung in Python (Python-Version APG4b)
Eine Einführung in die Python-Programmierung
Einführung in Python For, While
[Einführung in cx_Oracle] (Teil 6) Zuordnung von DB- und Python-Datentypen
[Einführung in die Udemy Python3 + -Anwendung] 31. Kommentar
Einführung in die Python Numerical Calculation Library NumPy
[Einführung in Python3 Tag 1] Programmierung und Python
[Einführung in Python] <numpy ndarray> [edit: 2020/02/22]
[Einführung in die Udemy Python3 + -Anwendung] 57. Decorator
Einführung in Python Hands On Teil 1
[Einführung in Python3 Tag 13] Kapitel 7 Zeichenfolgen (7.1-7.1.1.1)
[Einführung in Python] So analysieren Sie JSON
[Einführung in die Udemy Python3 + -Anwendung] 56. Abschluss
[Einführung in Python3 Tag 14] Kapitel 7 Zeichenfolgen (7.1.1.1 bis 7.1.1.4)
Einführung in Protobuf-c (C-Sprache ⇔ Python)
[Einführung in die Udemy Python3 + -Anwendung] 59. Generator
[Einführung in Python3 Tag 15] Kapitel 7 Zeichenfolgen (7.1.2-7.1.2.2)
[Einführung in Python] Verwenden wir Pandas
[Einführung in Python] Verwenden wir Pandas
[Einführung in die Udemy Python3 + -Anwendung] Zusammenfassung
Einführung in die Bildanalyse opencv python
[Einführung in Python] Verwenden wir Pandas
Erste Schritte mit Python für Nicht-Ingenieure
Einführung in Python Django (2) Mac Edition
[AWS SAM] Einführung in die Python-Version
[Einführung in Python3 Tag 21] Kapitel 10 System (10.1 bis 10.5)
[Python Tutorial] Eine einfache Einführung in Python
Ich las "Das Lernen mit Python von der Einführung bis zur Praxis stärken", Kapitel 1
Ich las "Das Lernen mit Python von der Einführung bis zur Praxis stärken", Kapitel 2
[Einführung in die Udemy Python3 + -Anwendung] 18. Listenmethode
[Einführung in die Udemy Python3 + -Anwendung] 63. Notation zur Einbeziehung des Generators
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Wiedereinführung in Python-Dekoratoren ~ Lernen wir Dekoratoren nach Typ ~
[Einführung in die Udemy Python3 + -Anwendung] 25. Wörterbuchmethode
Einführung in die diskrete Ereignissimulation mit Python # 1
[Einführung in die Udemy Python3 + -Anwendung] 13. Zeichenmethode
[Einführung in Python3, Tag 17] Kapitel 8 Datenziele (8.1-8.2.5)
[Einführung in die Udemy Python3 + -Anwendung] 55. In-Function-Funktionen
[Einführung in die Udemy Python3 + -Anwendung] 48. Funktionsdefinition
[Einführung in Python3, Tag 17] Kapitel 8 Datenziele (8.3-8.3.6.1)
Python Bit Arithmetic Super Einführung
[Einführung in die Udemy Python3 + -Anwendung] 10. Numerischer Wert
Einführung in das Auffüllen von Python-Bildern Auffüllen von Bildern mit ImageDataGenerator
Web-WF Python Tornado Teil 3 (Einführung in Openpyexcel)
[Einführung in die Udemy Python3 + -Anwendung] 45. Aufzählungsfunktion
[Einführung in die Udemy Python3 + -Anwendung] 41. Eingabefunktion
[Einführung in Python] Verwenden wir foreach mit Python
[Einführung in Python3 Tag 19] Kapitel 8 Datenziele (8.4-8.5)
[Einführung in die Udemy Python3 + -Anwendung] 17. Listenoperation
[Einführung in die Udemy Python3 + -Anwendung] 65. Ausnahmebehandlung