首页 > 解决方案 > 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]”,预期为“Offset”)

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

错误

标签: pythontype-hintingmypypython-typing

解决方案


您需要Offset从您的x, y元组显式创建一个:

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

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

可能只是为了您的示例,但如果f确实在返回a 之前x和之前没有执行任何验证,则 a这里是不必要的。在这种情况下,我建议声明为:yOffsetNewTypeOffset

Offset = tau.Tuple[int, int]

这是一个类型别名


推荐阅读