Utilisez-vous les indices de type de Python? Puisque Python est un langage typé dynamiquement, certaines personnes peuvent trouver avantageux de pouvoir coder sans informations de type explicites. Cette opinion est valable, mais je pense qu'il est également vrai qu'en spécifiant explicitement le type, il est possible de coder moins sujet aux bogues. Cet article traite d'une introduction au contenu intermédiaire sur les types Python. J'espère que cela vous aidera à améliorer vos compétences Python.
Une bibliothèque appelée mypy est nécessaire pour l'analyse de type statique de Python, mais je n'expliquerai pas comment utiliser mypy et comment l'installer.
Comment écrire le type de variable est la suivante.
<Nom de variable>:<Moule>
<Nom de variable>:<Moule> = <valeur initiale>
Lors de son utilisation réelle, ce sera comme suit.
test: int = 12
test2: bool = True
test3: str = 'Hello'
test4: float = 1.12
test = 'hello' #J'obtiens une erreur mypy
J'ai une variable appelée test définie dans int, mais lorsque j'essaie d'attribuer une chaîne, j'obtiens une erreur mypy. ** J'obtiens une erreur mypy, mais le code lui-même fonctionne correctement. ** **
Ensuite, regardons les dictionnaires et les types de tableaux.
test5: list = [1, 2, 3]
test6: dict = {'name': 'taro'}
test5 = 12 #J'obtiens une erreur mypy
test6 = 'Name' #J'obtiens une erreur mypy
J'ai défini test5 comme un tableau et test6 comme un dictionnaire, donc si j'essaie d'attribuer une autre valeur, j'obtiens une erreur mypy. La définition de type ci-dessus est correcte, mais nous vous recommandons d'utiliser la saisie List et Dict pour les tableaux et les dictionnaires.
from typing import List, Dict
test7: List[int] = [1, 2, 3] #Peut être réduit aux séquences int uniquement
test8: Dict[str, str] = {'name': 'taro'} #Vous pouvez restreindre les clés et les valeurs du dictionnaire à str uniquement
Pour test5 et test6, vous ne pouvez définir le type que sous la forme d'un tableau ou d'un dictionnaire. Cependant, dans le cas de test7 et test8, il est possible de spécifier des types plus détaillés tels qu'un tableau d'entiers et un dictionnaire avec des clés et des valeurs de str. Fondamentalement, nous vous recommandons d'utiliser ceci.
Je pense qu'il existe de nombreuses situations dans lesquelles vous souhaitez autoriser int et str pour une variable. Dans ce cas, utilisez Union.
from typing import Union
test9: Union[int, str] = 10 #Autoriser int et str
test9 = 'Name' # OK
test9 = bool #J'obtiens une erreur mypy
J'ai défini test9 comme une variable qui autorise int et str, donc j'obtiens une erreur mypy lorsque j'essaye d'attribuer la valeur de bool.
La forme de base du type de fonction est la suivante.
def <Nom de la fonction>(<Nom de variable>:<Moule>) -><戻り値のMoule>:
...
Lors de son utilisation réelle, ce sera comme suit.
def add(x: int, y: int) -> int:
return x + y
En fait, l'erreur mypy ne se produit pas même si vous affectez la valeur de int ou la variable à la variable définie par float. Vous pouvez le définir avec Union [int, float], mais il est recommandé de le définir avec float car le code sera plus propre.
#Si la variable doit être à la fois int et float, tapez-la avec float
def add(x: float, y: float) -> float:
return x + y
a: int = 1
add(a, 2) # OK
Souvent, il n'y a pas de valeur de retour pour la fonction. Dans ce cas, définissez le type de retour sur Aucun.
def log_print(number: int) -> None:
print('La valeur est{}est'.format(number))
b = log_print(12) # mypy error
Si vous essayez d'attribuer la valeur de retour d'une fonction qui n'a pas de valeur de retour à la variable b, vous obtiendrez une erreur mypy.
Si vous utilisez la méthode get sur un dictionnaire, elle renverra la valeur correspondante si la clé existe dans le dictionnaire, ou None si la clé n'existe pas. Dans ce cas, vous pouvez définir un type qui autorise la valeur + Aucun dans Union, mais vous pouvez utiliser Facultatif pour écrire le code proprement.
from typing import Optional
test10: Dict[str, str] = {'name': 'taro'}
test11: Optional[str] = test10.get('name') # str+N'autoriser aucun
test11 = test10.get('age') #Aucun retourne
Dans le cas ci-dessus, test11 peut être défini comme un type qui autorise str et None.
Je pense que le type de dictionnaire est souvent utilisé dans le codage. J'ai déjà mentionné que vous pouvez utiliser la saisie de Dict pour affiner plus en détail les types de clé et de valeur, mais vous pouvez affiner plus en détail.
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
En écrivant comme ci-dessus, il est possible de définir le type que Movie a une valeur de clé de nom de str et année a une valeur de clé de int. Bien sûr, si vous essayez d'ajouter ou de référencer des données avec une clé non définie, vous obtiendrez une erreur mypy.
à partir de la saisie de l'import Typed Dict
n'est valide que dans Python 3.8 ou version ultérieure.
Pour les versions antérieures, utilisez from typing_extensions import TypedDict
.Il n'y a rien de plus que l'explication jusqu'à présent en ce qui concerne les cours. Il est possible de saisir des variables membres et des fonctions membres.
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
Bien sûr, le code ci-dessus entraînera une erreur car la classe Student n'a pas de variable membre appelée age defined.
Si Any est ajouté, la cohérence de type sera ignorée.
from typing import Any
#Peut être défini comme une variable qui accepte n'importe quel type en ajoutant Any
test12: Any = {'name': 'taro', 'age': 12}
test12 = 'Hello' # No mypy Error
Non seulement vous pouvez attribuer une valeur à cette variable avec Any, mais cela peut également être dangereux dans de nombreuses situations.
from typing import Any
test13: int = 10
test13 = test12 #Les variables définies par Any peuvent être affectées à n'importe quelle variable
def sub(x: float, y: float) -> float:
return x - y
test14: Any = 'Hello'
sub(test14, 12.1) #Autorise une chaîne même si elle ne doit pas contenir de chaîne
Si vous définissez une variable avec Any, lors de l'affectation de cette variable à une autre variable, la vérification de type telle que lorsque vous l'utilisez comme argument d'une fonction est ignorée. Par conséquent, l'utilisation de Any est strictement interdite car elle peut provoquer un comportement inattendu. Je pense qu'il vaut mieux ne pas écrire une définition de type que d'utiliser Any.
Il est rarement utilisé, mais il est possible de donner au type un alias.
#Donnez au type un alias
UserData = Dict[str, Union[str, List[Dict[str, str]]]]
hanako: UserData = {
'user-id': '1234',
'belongings': [{'id': '12', 'name': 'PC'}, {'id': '23', 'name': 'Tablet'}],
}
Cet article traite du contenu de niveau basique à intermédiaire. Il y a des contenus plus difficiles en plus des contenus traités cette fois, mais je pense que les contenus traités cette fois ne suffisent pas pour coder normalement. En ce qui concerne les types Python, la référence de mypy est détaillée et facile à comprendre, donc je pense qu'il serait bon de s'y référer. mypy Type hints cheat sheet J'espère que cela aide même un peu votre codage. Puis (* ^ ▽ ^ *)
Recommended Posts