web-dev-qa-db-fra.com

Utilisation de List / Tuple / etc. de taper vs se référant directement au type liste / Tuple / etc

Quelle est la différence d'utiliser List, Tuple, etc. à partir du module typing:

from typing import Tuple

def f(points: Tuple):
    return map(do_stuff, points)

Au lieu de se référer directement aux types de Python:

def f(points: Tuple):
    return map(do_stuff, points)

Et quand dois-je utiliser l'un sur l'autre?

35
Markus Meskanen

typing.Tuple et typing.List sont ( Types génériques ; cela signifie que vous pouvez spécifier de quel type leur contenu doit être:

def f(points: Tuple[float, float]):
    return map(do_stuff, points)

Ceci spécifie que le Tuple transmis doit contenir deux valeurs float. Vous ne pouvez pas faire cela avec le type Tuple intégré.

typing.Tuple est spécial ici car il vous permet de spécifier un nombre spécifique d'éléments attendus et le type de chaque position. Utilisez des points de suspension si la longueur n'est pas définie et que le type doit être répété: Tuple[float, ...] décrit une longueur variable Tuple avec floats.

Pour typing.List et d'autres types de séquence, vous ne spécifiez généralement que le type de tous les éléments; List[str] est une liste de chaînes, de n'importe quelle taille. Notez que les fonctions doivent préférentiellement prendre typing.Sequence comme arguments et typing.List n'est généralement utilisé que pour les types de retour; de manière générale, la plupart des fonctions prennent n'importe quelle séquence et ne font qu'itérer, mais lorsque vous retournez un list, vous renvoyez vraiment un type de séquence spécifique et modifiable.

Vous devez toujours choisir les génériques typing même si vous ne restreignez pas actuellement le contenu. Il est plus facile d'ajouter cette contrainte ultérieurement avec un type générique car le changement résultant sera plus petit.

66
Martijn Pieters