例如,我有一段代码如下:
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
的理解,只要T
是SuperClass
的子类,就可以了。但是,为什么mypy在这里抛出错误?谢谢!
答案 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
应该在非常特殊的情况下使用;文档指出:
发布常用于使虚假的类型检查器警告消失,并在类型检查器无法完全理解所发生的情况时提供一些帮助。
因此,您应该在这里严重质疑您的设计!给我们更多有关您要实现的目标的信息。也许有比您想要做的更好和更干净的设计。