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)
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'))
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.
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)
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.
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'
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'
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.
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.
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