Mypy тип конкатенации кортежей

У меня есть функция, которая принимает определенные кортежи и объединяет их, и я пытаюсь указать тип вывода, но mypy не согласен со мной.

Файл test.py:

from typing import Tuple

def test(a: Tuple[str, str], b: Tuple[int, int]) -> Tuple[str, str, int, int]:
    return a + b

запуская mypy 0.641 как mypy --ignore-missing-imports test.py я получаю:

test.py:5: error: Incompatible return value type (got "Tuple[Any, ...]", expected "Tuple[str, str, int, int]")

Что, я думаю, верно, но более общее, учитывая, что я указываю свои входные данные.


person mpaskov    schedule 08.02.2019    source источник


Ответы (3)


Это известная проблема, но, похоже, нет времени, когда mypy можно будет это сделать. правильное определение типа.

person chepner    schedule 08.02.2019

Объединение кортежей фиксированной длины в настоящее время не поддерживается mypy. В качестве обходного пути вы можете создать кортеж из отдельных элементов:

from typing import Tuple

def test(a: Tuple[str, str], b: Tuple[int, int]) -> Tuple[str, str, int, int]:
    return a[0], a[1], b[0], b[1]

или используя распаковку, если у вас Python 3.5+:

def test(a: Tuple[str, str], b: Tuple[int, int]) -> Tuple[str, str, int, int]:
    return (*a, *b)  # the parentheses are required here
person Eugene Yarmash    schedule 08.02.2019

Вот менее подробный обходной путь (python3.5+):

from typing import Tuple

def f(a: Tuple[str, str], b: Tuple[int, int]) -> Tuple[str, str, int, int]:
    return (*a, *b)
person Anthony Sottile    schedule 08.02.2019