首页 > 解决方案 > Mypy 似乎忽略了 TypeVar 类型的界限

问题描述

例如,我有一段代码如下:

from typing import Type, TypeVar, cast

class SuperClass:
    pass


T = TypeVar('T', bound=SuperClass)


def cast_to(obj: SuperClass, cast_to: Type[T] = SuperClass) -> T:
    return cast(cast_to, obj)

我把它保存在type_check.py. 如果我在其上运行 mypy,则会收到以下错误消息:

type_check.py:10: error: Incompatible default for argument "cast_to" (default has type "Type[SuperClass]", argument has type "Type[T]")
type_check.py:11: error: Invalid type "cast_to"

根据我对boundin的理解TypeVar,只要 aT是 的子类SuperClass,应该没问题。但是为什么 mypy 在这里抛出错误呢?谢谢!

标签: pythonmypypython-typing

解决方案


您的代码有两个问题:首先,您的cast_to函数的签名应该是:

def cast_to(obj: SuperClass, cast_to: Type[T] = Type[SuperClass]) -> T:

然后,在您的陈述cast中,我不确定mypy是否允许您将. 相反,您可以尝试:cast_tocast

def cast_to(obj: SuperClass, cast_to: Type[T]) -> T:
    return cast(T, obj)

当然,使用此定义,您将无法cast_to仅使用一个参数进行调用。


我现在要问:为什么你觉得你需要这样做?你确定你的设计是好的吗?cast应该在非常特殊的情况下使用;该文件指出:

强制转换用于消除虚假的类型检查器警告,并在类型检查器无法完全理解发生了什么时为它提供一点帮助。

所以你应该在这里认真质疑你的设计!给我们更多关于你想要达到的目标的信息。也许有比你想做的更好、更干净的设计。


推荐阅读