我想使用一个类型检查器来帮助我写出好的代码,我想 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")
有没有一种方法可以像我一样完全按照类型检查器理解的方式来编写它?
最佳答案
您需要从您的 x, y
元组显式创建一个 Offset
:
def f(x: int, y: int) -> Offset:
return Offset((x, y))
这是因为,来自NewType helper function :“类型检查器需要从 int
显式转换,其中 UserId
是预期的”,或者在您的情况下:从 Tuple[int, int]
到 偏移量
。
可能只是为了你的例子,但如果 f
确实在返回 Offset 之前不对
,这里不需要x
和 y
执行任何验证NewType
。在这种情况下,我建议将 Offset
声明为:
Offset = tau.Tuple[int, int]
这是一个type alias .
关于Python NewType ('X' , Y) : mypy displays error: got Y, 预期 X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64185542/