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.
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.
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. ** **.
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.
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.
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
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
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.
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.
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.
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.
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.
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'}],
}
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