我想使用类型检查器来帮助我编写好的代码,并且我认为 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
元组显式创建 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]
这是一个类型别名。