python - Python NewType('X', Y): mypy 显示错误:得到 Y,预期 X
问题描述
我想使用一个类型检查器来帮助我编写好的代码,并且我认为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”)
有没有办法像我一样编写它,但是以一种类型检查器理解的方式?
解决方案
您需要Offset
从您的x, y
元组显式创建一个:
def f(x: int, y: int) -> Offset:
return Offset((x, y))
这是因为,来自NewType 辅助函数:“类型检查器需要从预期的int
位置进行显式转换”,或者在您的情况下: from to 。UserId
Tuple[int, int]
Offset
可能只是为了您的示例,但如果f
确实在返回a 之前x
和之前没有执行任何验证,则 a这里是不必要的。在这种情况下,我建议声明为:y
Offset
NewType
Offset
Offset = tau.Tuple[int, int]
这是一个类型别名。
推荐阅读
- evosuite - Evosuite:错误 TestSuiteGenerator 全栈:java.lang.IllegalArgumentException:null
- reactjs - 如何使用 joi 模式在反应 js 中进行密码验证?
- angular - Angular 的库是怎么回事?这些是多余的吗?
- r - 如何使用循环函数在同一个图上创建多个 ggboxplots?
- javascript - 更新对象值
- javascript - 使用 jQuery 的 PHP 表单提交在表中不起作用
- clojure - 嵌套级别之间具有相互依赖值的映射规范?
- asp.net - 我可以使用带有 Web 应用服务的 Azure 文件存储吗?
- c - 如何从仅具有该特定字段指针的字段的偏移量计算结构的起始地址
- javascript - 使用单引号时,多行字符串抛出“`SyntaxError`: Invalid or unexpected token”