Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Mypy似乎忽略了TypeVar类型的绑定_Python_Mypy_Python Typing - Fatal编程技术网

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好的,这是有意义的!谢谢你的帮助!