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

3
我希望使用一种类型检查器来帮助我编写良好的代码,我认为 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")
有没有一种方法可以像我所做的那样精确地编写它,但是以一种类型检查器能够理解的方式?

error

1个回答

6
你需要从你的 x, y 元组中明确创建一个 Offset:
def f(x: int, y: int) -> Offset:
    return Offset((x, y))

这是因为从 NewType辅助函数中可以看出:“类型检查器要求在预期为UserId的情况下,需要从int进行显式转换”,或者在您的情况下:从Tuple[int, int]Offset

也许只是针对您的示例,但如果f在返回Offset之前确实没有对xy执行任何验证,则此处不需要NewType。在这种情况下,我建议将Offset声明为:

Offset = tau.Tuple[int, int]

这是一个类型别名


你的解决方案有效,谢谢 :)类型别名不支持最后的断言。 - Telcrome

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接