mypy: Как "преобразовать" кортеж переменной длины обратно в кортеж фиксированной длины? - PullRequest
0 голосов
/ 26 февраля 2019

Код Python:

t = (1,2,3)
t = tuple(x+1 for x in t)

mypy жалуется:

2: error: Incompatible types in assignment (expression has type "Tuple[int, ...]", variable has type "Tuple[int, int, int]")

Что я должен сделать, чтобы избежать этой ошибки?Это не помогает:

t = (1,2,3)
t = tuple(x+1 for x in t)[0:3]

Это "работает":

from typing import Tuple
t: Tuple[int, ...] = (1,2,3)
t = tuple(x+1 for x in t)

Но на самом деле я не хочу, чтобы t был кортежом переменной длины.

Конечно, я могу сказать mypy игнорировать строку:

t = (1,2,3)
t = tuple(x+1 for x in t) # type: ignore

Или повторить себя:

t = (1,2,3)
t = (t[0]+1, t[1]+1, t[2]+1)

Или использовать временную переменную, чтобы хотя бы избежать повторения части +1(что более сложно в реальной проблеме):

t = (1,2,3)
tmp = tuple(x+1 for x in t)
t = (tmp[0], tmp[1], tmp[2])

Есть ли лучшее решение?

1 Ответ

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

Вы можете использовать cast , чтобы обойти это.

from typing import cast, Tuple

t = (1,2,3)

t = cast(Tuple[int, int, int], tuple(x+1 for x in t))
...