Python Language Ajouter des types à une fonction


Exemple

Prenons un exemple de fonction qui reçoit deux arguments et renvoie une valeur indiquant leur somme:

def two_sum(a, b):
    return a + b

En regardant ce code, on ne peut pas et sans doute indiquer le type des arguments pour la fonction two_sum . Il fonctionne à la fois avec les valeurs int :

print(two_sum(2, 1))  # result: 3

et avec des cordes:

print(two_sum("a", "b"))  # result: "ab"

et avec d'autres valeurs, telles que les list s, tuple s et cetera.

En raison de la nature dynamique des types python, où beaucoup sont applicables à une opération donnée, tout vérificateur de type ne pourrait pas raisonnablement affirmer si un appel pour cette fonction devrait être autorisé ou non.

Pour aider notre vérificateur de types, nous pouvons maintenant lui fournir des indications de type dans la définition de fonction, indiquant le type que nous autorisons.

Pour indiquer que nous voulons seulement autoriser les types int nous pouvons changer notre définition de fonction pour qu'elle ressemble à:

def two_sum(a: int, b: int):
    return a + b

Les annotations suivent le nom de l' argument et sont séparés par un : caractère.

De même, pour indiquer que seuls les types str sont autorisés, nous modifierons notre fonction pour la spécifier:

def two_sum(a: str, b: str): 
    return a + b

En plus de spécifier le type des arguments, on pourrait également indiquer la valeur de retour d'un appel de fonction. Cela se fait en ajoutant le caractère -> suivi du type après la parenthèse fermante dans la liste des arguments, mais avant le : à la fin de la déclaration de la fonction:

def two_sum(a: int, b: int) -> int: 
    return a + b

Maintenant, nous avons indiqué que la valeur de retour lors de l'appel à two_sum devrait être de type int . De même, nous pouvons définir des valeurs appropriées pour str , float , list , set et autres.

Bien que les indicateurs de type soient principalement utilisés par les vérificateurs de type et les IDE, il est parfois nécessaire de les récupérer. Cela peut être fait en utilisant l' __annotations__ spécial __annotations__ :

two_sum.__annotations__
# {'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}