Beherrsche den Typ mit Python [Python 3.9 kompatibel]

Einführung

Jedermann. Schreibst du in Python? Kürzlich habe ich die Bedeutung von Typen erneut bekräftigt und diesen Artikel in der Hoffnung geschrieben, dass jeder Typ in Python schreiben würde.

Als Einschränkung wird in diesem Artikel Folgendes nicht erwähnt:

Dieser Inhalt ist eine Ergänzung zu dem Artikel, den ich zuvor geschrieben habe. Wenn Sie möchten, lesen Sie bitte den vorherigen Artikel.

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

Warum überhaupt Typen in Python schreiben?

Python ist eine dynamisch typisierte Sprache, sodass Ihr Programm ohne Schreiben von Typen funktioniert. Wenn Sie den Typ nicht schreiben, wird die Menge an Code reduziert, und ich denke, es ist ein Vorteil, dass die Sprache für Anfänger leicht zu lernen ist. Wenn Sie jedoch eine bestimmte Anzahl von Codezeilen schreiben und ein Programm von mehreren Personen verwalten, treten die folgenden Probleme auf, wenn kein Typ vorhanden ist.

Unter dem Gesichtspunkt, das Programm über einen langen Zeitraum aufrechtzuerhalten, denke ich, dass ein Typ einen Vorteil hat.

Betrachten Sie beispielsweise die folgende Funktion.

def add(a, b):
    """Gibt das Ergebnis des Hinzufügens von Argumenten zurück"""
    return a + b

def add_type(a: int, b: int) -> int:
    """Gibt das Ergebnis des Hinzufügens von Argumenten zurück"""
    return a + b

Funktioniert mit demselben Inhalt, aber einer hat einen Typ und der andere hat keinen Typ. Sie können es tatsächlich so verwenden, aber wenn der Ersteller der Funktion nicht erwartet hat, dass es eine Zeichenfolge enthält, zeigt die Funktion add_type mit einem Typ einen Fehler im Editor an.

print(add('1', '2'))
print(add_type('1', '2'))

Snag_24252617.png

Der Ersteller und Benutzer einer Funktion sind nicht immer gleich, und selbst eine von Ihnen erstellte Funktion wird ihren Inhalt im Laufe der Zeit vergessen. Wenn Sie einen Typ angeben, können Sie erwarten, dass die Funktion wie erwartet verwendet wird.

Einführung in Schimmel

Eingebauter Typ (Liste, Diktat, Tupel)

In Bezug auf Liste usw. unterscheidet sich die Schreibmethode zwischen Python 3.8 und 3.9. Die traditionelle Typisierungsmethode ist veraltet und die integrierte Typisierungsmethode wurde empfohlen.

Für Python 3.8

from typing import Dict, List, Tuple

val_e: Dict[str, int] = {'size': 12, 'age': 24}
val_f: List[str] = ['taro', 'jiro']
val_g: Tuple[str, int] = ('name', 12)

Für Python 3.9

val_e: dict[str, int] = {'size': 12, 'age': 24}
val_f: list[str] = ['taro', 'jiro']
val_g: tuple[str, int] = ('name', 12)

Über Final

Final ist seit Python 3.8 standardmäßig verfügbar. Sie können verhindern, dass es neu zugewiesen wird, indem Sie eine Konstante definieren (nicht neu zuweisbar).

from typing import Final
TABLE_NAME: Final[str] = 'sample'

Ich erhalte eine Fehlermeldung, wenn ich versuche, eine Neuzuweisung vorzunehmen.

Snag_243720df.png

Verwenden Sie aktiv Tupel für Konstanten

Da Liste und Tupel ähnliche Funktionen haben, verwende ich normalerweise Liste, aber ich werde sie einführen, da Tupel möglicherweise mehr Vorteile hat. Im Fall einer Liste ist es möglich, die internen Informationen neu zu schreiben. In den meisten Fällen möchte die Definition einer Konstanten jedoch nicht, dass die internen Informationen neu geschrieben werden. Wenn Sie es in einem solchen Fall mit Tupel definieren, müssen Sie sich keine Sorgen machen, dass die internen Informationen geändert werden.

Für Python 3.8

from typing import Final, Tuple, List

#Da es sich um ein Tupel handelt, kann es nicht geändert werden
NAME_TUPLE: Final[Tuple[str, str]] = ('taro', 'jiro')

#Liste kann geändert werden
NAME_LIST: Final[List[str]] = ['taro', 'jiro']
NAME_LIST[0] = 'saburo'

Für Python 3.9

from typing import Final

#Da es sich um ein Tupel handelt, kann es nicht geändert werden
NAME_TUPLE: Final[tuple[str, str]] = ('taro', 'jiro')

#Liste kann geändert werden
NAME_LIST: Final[list[str]] = ['taro', 'jiro']
NAME_LIST[0] = 'saburo'

Verwenden Sie aktiv benanntes Tupel für Konstanten

Ich denke, es gibt Fälle, in denen Diktat für Konstanten verwendet wird. In diesem Fall können Sie sicher sein, dass durch die Verwendung von namedtuple die internen Informationen nicht geändert werden.

from typing import NamedTuple, TypedDict

class StudentInfoTuple(NamedTuple):
    name: str
    age: int

class StudentInfoDict(TypedDict):
    name: str
    age: int

#Im Fall von namedtuple können interne Informationen nicht neu geschrieben werden
TARO: Final[StudentInfoTuple] = StudentInfoTuple('taro', 12)
#Die folgende Zeile führt zu einem Fehler
# TARO.name = 'taro2'

#Im Falle eines Diktats können interne Informationen neu geschrieben werden
JIRO: Final[StudentInfoDict] = {'name': 'jiro', 'age': 9}
JIRO['name'] = 'jiro2'

Informationen zu optionalen Argumenten von TypedDict

Erstens gibt es zwei Möglichkeiten, TypedDict zu schreiben. Im folgenden Beispiel können MovieA und MovieB auch als Typen verwendet werden.

from typing import TypedDict

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

class MovieB(TypedDict):
    name: str
    year: int

cat: MovieA = {'name': 'cat', 'year': 1993}
dog: MovieB = {'name': 'dog', 'year': 2000}

Was ist, wenn Sie überlegen möchten, ob ein Typ namens Movie ein Attribut namens author hat oder nicht? Schreiben Sie in diesem Fall wie folgt.

from typing import TypedDict

class MovieRequiredType(TypedDict):
    name: str
    year: int

class MovieOptionalType(TypedDict, total=False):
    author: str

class MovieType(MovieRequiredType, MovieOptionalType):
    pass

#MovieType kann das Autorenattribut haben oder nicht
rabbit: MovieType = {'name': 'rabbit', 'year': 2002}
deer: MovieType = {'name': 'deer', 'year': 2006, 'author': 'jack'}

Wenn die erforderlichen Attribute Name und Jahr nicht vorhanden sind, tritt im Editor natürlich ein Fehler auf.

Snag_246ae987.png

Es gibt zwei Möglichkeiten, TypedDict zu schreiben, aber der Klassenstil hat den Vorteil, dass er mehrfach vererbt werden kann. Daher denke ich, dass es viele Menschen gibt, die dies aktiv nutzen.

Schließlich

Ich hoffe, Sie verstehen die Bedeutung von Typen in Python. Das Schreiben eines Typs kann umständlich erscheinen, aber je komplexer der Code ist, desto besser können Sie den Wert des Typs verstehen. Last but not least wird die Python 3.9-Notation von einigen Tools (z. B. mypy) nicht unterstützt. Seien Sie also vorsichtig, wenn Sie sie verwenden. (Stand Oktober 2020)

Recommended Posts

Beherrsche den Typ mit Python [Python 3.9 kompatibel]
[Python] Bestimmen Sie den Typ der Iris mit SVM
Rufen Sie die API mit python3 auf.
Extrahieren Sie die xz-Datei mit Python
Holen Sie sich das Wetter mit Python-Anfragen
Den Typ mit Python beherrschen? (Wann ist eine Typprüfung durchzuführen?)
Finden Sie die Bearbeitungsentfernung (Levenshtein-Entfernung) mit Python
Klicken Sie mit Python auf die Etherpad-Lite-API
Ich mochte den Tweet mit Python. ..
Beherrsche das schwache Ref-Modul in Python
Machen Sie die Python-Konsole mit UNKO bedeckt
[Python] Legen Sie den Diagrammbereich mit matplotlib fest
[Python] Einfache Überprüfung des Argumenttyps mit Datenklasse
[Blender x Python] Lass uns das Material beherrschen !!
Hinter dem Flyer: Docker mit Python verwenden
Überprüfen Sie die Existenz der Datei mit Python
[Python] Ruft den Variablennamen mit str ab
[Python] Runden Sie nur mit dem Operator ab
Zeigen Sie Python 3 im Browser mit MAMP an
Durchsuche das Labyrinth mit dem Python A * -Algorithmus
Lesen wir die RINEX-Datei mit Python ①
Arbeiten mit OpenStack mit dem Python SDK
Laden Sie mit Python Dateien im Web herunter
Empfangen Sie den Datumstyp (Datum / Uhrzeit) mit ArgumentParser [Python]
[Python] Lassen Sie uns matplotlib mit Japanisch kompatibel machen
[Python] [Meta] Ist der Python-Typ ein Typ?
Lernen Sie das Entwurfsmuster "Singleton" mit Python
[Python] Betreiben Sie den Browser automatisch mit Selenium
Lernen Sie das Designmuster "Facade" mit Python
Der Weg zum Kompilieren zu Python 3 mit Thrift
FizzBuzz in Python3
Scraping mit Python
Numerischer Python-Typ
Statistik mit Python
Scraping mit Python
Python mit Go
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Python2-Zeichenfolgentyp
Python # String-Typ
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Der schnellste Weg für Anfänger, um Python zu beherrschen
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Bereiten Sie die Ausführungsumgebung von Python3 mit Docker vor
2016 Todai Mathematik mit Python gelöst
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Finden Sie den Stimmungswert mit Python (Rike Koi)