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

时间:2019-01-29 03:47:06

标签: python mypy python-typing

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

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"

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

1 个答案:

答案 0 :(得分:1)

您的代码有两个问题:首先,您的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应该在非常特殊的情况下使用;文档指出:

  

发布常用于使虚假的类型检查器警告消失,并在类型检查器无法完全理解所发生的情况时提供一些帮助。

因此,您应该在这里严重质疑您的设计!给我们更多有关您要实现的目标的信息。也许有比您想要做的更好和更干净的设计。