Python Mypy似乎忽略了TypeVar类型的绑定
例如,我有一段代码,如下所示:Python Mypy似乎忽略了TypeVar类型的绑定,python,mypy,python-typing,Python,Mypy,Python Typing,例如,我有一段代码,如下所示: 从输入导入类型、TypeVar、cast 类超类: 通过 T=TypeVar('T',bound=SuperClass) def cast_to(对象:超类,cast_to:Type[T]=超类)->T: 返回铸造(铸造至,obj) 我把它保存在type_check.py中。如果在其上运行mypy,则会收到以下错误消息: type_check.py:10: error: Incompatible default for argument "cast_to" (d
从输入导入类型、TypeVar、cast
类超类:
通过
T=TypeVar('T',bound=SuperClass)
def cast_to(对象:超类,cast_to:Type[T]=超类)->T:
返回铸造(铸造至,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"
根据我对
TypeVar
中bound
的理解,只要T
是SuperClass
的一个子类,就可以了。但是为什么mypy在这里抛出错误呢?谢谢 您的代码有两个问题:首先,cast\u to
函数的签名应该是:
def cast_to(obj: SuperClass, cast_to: Type[T] = Type[SuperClass]) -> T:
然后,在您的cast
语句中,我不确定mypy
是否允许您使用cast\u to
作为cast
的第一个参数。相反,您可以尝试:
def cast_to(obj: SuperClass, cast_to: Type[T]) -> T:
return cast(T, obj)
当然,使用此定义,您将无法仅使用一个参数调用cast_to
我现在要问:为什么你觉得你需要这样做?你确定你的设计好吗<代码>强制转换应在非常特殊的情况下使用;文件规定: 强制转换用于消除虚假的类型检查器警告,并在类型检查器不能完全理解发生了什么时提供一些帮助
所以你应该认真地质疑你的设计!请给我们提供更多关于您试图实现的目标的信息。也许有比你想要做的更好更干净的设计。谢谢你的回复!基本上,我正在尝试构建一个反序列化函数,该函数可以自动将加载的对象强制转换为指定的类型,并且我想将该类型限制为
超类的子类型
@NoSegfault,这是我从您的代码中理解的。但你为什么要这么做?你的物品来自哪里?mypy不能跟踪他们的类型吗?(如果没有,为什么?在您的设计中,是什么使mypy无法跟踪对象的类型?)。对象来自加载的pickle,它可以是超类的任何子类。实际上,在我的代码中,cast_to
函数不是获取一个对象,而是获取一个指向pickle文件的路径,函数名为load
。load
的返回类型是超类
,尽管它实际上是超类
的一个子类。当我使用对象时,这是有问题的,因为类型检查器会抱怨超类中没有定义某些方法。最初,每次加载对象时,我都进行类型转换,这很烦人。所以我只是融合到加载函数中。@NoSegfault好的,这是有意义的!谢谢你的帮助!