Python NewType ('X' , Y) : mypy displays error: got Y, 预期 X

标签 python type-hinting mypy python-typing

我想使用一个类型检查器来帮助我写出好的代码,我想 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

最佳答案

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

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

这是因为,来自NewType helper function :“类型检查器需要从 int 显式转换,其中 UserId 是预期的”,或者在您的情况下:从 Tuple[int, int]偏移量

可能只是为了你的例子,但如果 f 确实在返回 Offset 之前不对 xy 执行任何验证,这里不需要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/

相关文章:

Python winreg 模块访问被拒绝

python - 输入未导入的模块

python - mypy - 项目 "None"的 "Optional[CustomAttrsModel]"没有属性 "country"

python - mypy lambda 可选检查

python - pylint 为可调用的对象属性给出不可调用的错误

python - 如何将 python 类型注释添加到 flask 全局上下文 g?

python - 更改 DataFrame iterrows 中的 bool 值不会执行任何操作

python - 构造 JSON 以在 Django View 中循环

Python 3 异常 : TypeError: function missing 1 required positional argument: 'words'

Python 类型提示,可索引对象