Python NewType('X', Y):mypy 显示错误:得到 Y,预期为 X

Tel*_*ome 3 python type-hinting mypy python-typing

我想使用一个类型检查器来帮助我编写好的代码,而且我认为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
Run Code Online (Sandbox Code Playgroud)

对于我正在编写的框架,重要的是不仅要为类型分配标识符,而且我仍然希望类型检查器知道如何帮助我(所以不要只分配 TypeVar 并丢失信息)。

Typing.NewType 工作得很好,但 mypy 在第 7 行给了我一个错误:

不兼容的返回值类型(得到“Tuple[int, int]”,预期为“Offset”)

有没有一种方法可以像我一样编写它,但是类型检查器可以理解它?

错误

Mar*_*hac 5

您需要Offsetx, y元组中显式创建一个:

def f(x: int, y: int) -> Offset:
    return Offset((x, y))
Run Code Online (Sandbox Code Playgroud)

这是因为,来自NewType 辅助函数:“类型检查器需要从预期的int位置进行显式转换UserId”,或者在您的情况下: from Tuple[int, int]to Offset

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

Offset = tau.Tuple[int, int]
Run Code Online (Sandbox Code Playgroud)

这是一个类型别名