【问题标题】:Python NewType('X', Y): mypy displays error: got Y, expected XPython NewType('X', Y): mypy 显示错误:得到 Y,预期 X
【发布时间】:2021-01-18 22:57:52
【问题描述】:

我想使用一个类型检查器来帮助我编写好的代码,我认为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]”,预期 “偏移”)

有没有一种方法可以像我一样编写它,但要让类型检查器理解它?

【问题讨论】:

    标签: python type-hinting mypy python-typing


    【解决方案1】:

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

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

    这是因为,从 NewType helper function 开始:“类型检查器需要从 int 显式转换,而 UserId 是预期的”,或者在您的情况下:从 Tuple[int, int]Offset

    可能只是为了您的示例,但如果 f 在返回 Offset 之前确实没有对 xy 执行任何验证,则此处的 NewType 是不必要的。在这种情况下,我建议将Offset 声明为:

    Offset = tau.Tuple[int, int]
    

    这是一个type alias

    【讨论】:

    • 你的解决方案有效,谢谢 :) 类型别名到底不支持断言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2018-01-22
    • 2018-09-15
    • 2015-01-02
    相关资源
    最近更新 更多