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

问题描述 投票:0回答:1

我想使用类型检查器来帮助我编写好的代码,并且我认为 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

python python-typing mypy
1个回答
5
投票

您需要从

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]

这是一个类型别名

© www.soinside.com 2019 - 2024. All rights reserved.