Python NewType('X', Y): mypy displays error: got Y, expected X

Python NewType('X', Y): mypy displays error: got Y, expected 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 行给我一个错误:

Incompatible return value type (got "Tuple[int, int]", expected "Offset")

有没有一种方法可以像我一样完全按照类型检查器理解的方式来编写它?

您需要从 x, y 元组显式创建 Offset

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

这是因为,从 NewType helper function 开始:“类型检查器需要从 int 进行显式转换,其中需要 UserId”,或者在您的情况下:从 Tuple[int, int]Offset.

可能只是为了你的例子,但如果 f 在返回 Offset 之前确实没有对 xy 执行任何验证,那么 NewType 这里就不用了。在那种情况下,我建议将 Offset 声明为:

Offset = tau.Tuple[int, int]

这是一个 type alias.