Python NewType ('X', Y): mypy отображает ошибку: получил Y, ожидалось X

Я хочу использовать средство проверки типов, которое помогает мне писать хороший код, и думаю, что mypy делает то, что я хочу. Но я не понимаю, как написать следующий код.

import typing as tau

Offset = tau.NewType('Offset', tau.Tuple[int, int])


def f(x: int, y: int) -> Offset:
    return x, y


important_for_me = Offset != tau.Tuple[int, int]
assert important_for_me

Для фреймворка, который я пишу, важно не просто назначать идентификатор типу, но я все же хочу, чтобы проверка типов знала, как мне помочь (а не просто назначить TypeVar и потерять информацию).

typing.NewType отлично работает, но mypy выдает ошибку в строке 7:

Несовместимый тип возвращаемого значения (получено Tuple [int, int], ожидаемое смещение)

Есть ли способ написать это так же, как я, но так, чтобы это было понятно для проверки типов?

error


person Telcrome    schedule 03.10.2020    source источник


Ответы (1)


Вам нужно явно создать Offset из вашего x, y кортежа:

def f(x: int, y: int) -> Offset:
    return Offset((x, y))

Это потому, что из вспомогательной функции NewType: введите чекерам требуется явное приведение от int, где ожидается UserId, или, в вашем случае: от Tuple[int, int] до Offset.

Может быть просто для вашего примера, но если f действительно не выполняет проверку x и y перед возвратом Offset, NewType здесь не требуется. В этом случае я бы предложил объявить Offset как:

Offset = tau.Tuple[int, int]

который является псевдонимом типа.

person Mario Ishac    schedule 03.10.2020
comment
Ваше решение работает, спасибо :) Псевдоним типа не поддерживает утверждение в конце. - person Telcrome; 03.10.2020