Как аннотировать функцию, которая принимает кортеж переменной длины в Python? - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть функция, которая принимает в качестве аргумента кортеж разной длины:

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"))

Когда я аннотирую функцию, как указано выше, я получаю эти сообщения об ошибках

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 действительно работает с кортежами, и я использую их как неизменяемые списки переменной длины.Я не нашел никакого консенсуса по этой теме в интернете, поэтому мне интересно, как я должен комментировать этот вид ввода.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

В дополнение к ответу на эллипсис, опубликованному Azat, вы можете сделать его более явным, используя @typing.overload или 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]):
    ...

Илис союзом:

from typing import Tuple, Union


def process_tuple(t: Union[Tuple[str], Tuple[str, str], Tuple[str, str, str]]):
    # Do nasty tuple stuff
0 голосов
/ 18 февраля 2019

Однородный кортеж переменной длины, который мы можем аннотировать, используя ... литерал (он же Ellipsis), такой как

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

, после этого ошибки должны исчезнуть.

Из документов

Чтобы указать кортеж переменной длины однородного типа, используйте буквенный многоточие, например Tuple[int, ...].Простая Tuple эквивалентна Tuple[Any, ...], а в свою очередь tuple.

...