web-dev-qa-db-fra.com

Comment annoter une fonction qui prend un tuple de longueur variable? (annotation de type Tuple variadique)

J'ai une fonction qui prend un Tuple de différentes longueurs comme argument:

from typing import Tuple


def process_Tuple(t: Tuple[str]):
    # Do nasty Tuple stuff

process_Tuple(("a",))
process_Tuple(("a", "b"))
process_Tuple(("a", "b", "c"))

Lorsque j'annote une fonction comme mentionné ci-dessus, je reçois ces messages d'erreur

fool.py:9: error: Argument 1 to "process_Tuple" has incompatible type "Tuple[str, str]"; expected "Tuple[str]"
fool.py:10: error: Argument 1 to "process_Tuple" has incompatible type "Tuple[str, str, str]"; expected "Tuple[str]"

process_Tuple fonctionne vraiment avec les tuples et je les utilise comme des listes immuables de longueur variable. Je n'ai trouvé aucun consensus sur ce sujet sur Internet, je me demande donc comment annoter ce type de contribution.

11
Montreal

Tuple homogène de longueur variable que nous pouvons annoter en utilisant ... littéral (aka Ellipsis) comme

def process_Tuple(t: Tuple[str, ...]):
    ...

après cela, les erreurs devraient disparaître.

De docs

Pour spécifier un tuple de longueur variable de type homogène, utilisez des points de suspension littéraux, par ex. Tuple[int, ...]. Un Tuple simple équivaut à Tuple[Any, ...], puis à son tour sur Tuple.

20
Azat Ibrakov

En plus de la réponse Ellipsis publiée par Azat, vous pouvez la rendre plus explicite en utilisant @typing.overload ou typing.Union

from typing import Tuple


@overload
def process_Tuple(t: Tuple[str]):
    # Do nasty Tuple stuff

@overload
def process_Tuple(t: Tuple[str, str]):
    ...

Ou avec l'Union:

from typing import Tuple, Union


def process_Tuple(t: Union[Tuple[str], Tuple[str, str], Tuple[str, str, str]]):
    # Do nasty Tuple stuff
1
Wolph