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.
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, ...]
. UnTuple
simple équivaut àTuple[Any, ...]
, puis à son tour surTuple
.
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