Mypy 似乎忽略了 TypeVar 类型的界限

Mypy seems to ignore bound of a TypeVar type

比如我有一段代码如下:

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"

根据我对TypeVarbound的理解,只要TSuperClass的子类就可以了。但是为什么 mypy 在这里抛出错误?谢谢!

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

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

然后,在您的 cast 语句中,我不确定 mypy 是否允许您使用 cast_to 作为 cast 的第一个参数。相反,您可以尝试:

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

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


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

Casts are used to silence spurious type checker warnings and give the type checker a little help when it can’t quite understand what is going on.

所以你应该在这里认真质疑你的设计!向我们提供更多有关您要实现的目标的信息。也许有比您尝试做的更好、更简洁的设计。