Python 3.x issubclass(typing.List,List)引发TypeError
Python 3.x issubclass(typing.List,List)引发TypeError,python-3.x,annotations,Python 3.x,Annotations,typing.List在中被定义为类typing.List(List,MutableSequence[T]),这意味着它是List的一个子类,但issubclass()似乎对此感到困惑: issubclass(typing.List,typing.List)返回True,确认typing.List是一个类 但是issubclass(typing.List,List)引发TypeError:issubclass()arg 1必须是类,表示相反 为了消除混淆,issubclass(list,typi
typing.List
在中被定义为类typing.List(List,MutableSequence[T])
,这意味着它是List
的一个子类,但issubclass()
似乎对此感到困惑:
issubclass(typing.List,typing.List)
返回True,确认typing.List
是一个类
但是issubclass(typing.List,List)
引发TypeError:issubclass()arg 1必须是类,表示相反
为了消除混淆,issubclass(list,typing.list)
返回True
我知道我误解的可能性远远大于核心库函数被破坏的可能性,但我很想知道原因
这是Python 3.8.7
typing.List
定义为class-typing.List(List,MutableSequence[T])
是的,不是。我认为这更应该描述行为,但它不是以这种方式实现的
看看cpython的源代码是如何实现的。这是一个例子如果您使用
type()
,也可以找到这一点:
>类型(typing.List)
您可以看到这个类已经实现了。为了进一步参考,我复制/引用了cpython回购协议中的以下内容:
def子项检查(self,cls):
如为特殊情况:
如果不存在(cls,_GenericAlias):
返回issubclass(cls、自身来源)
如果是cls.\u特殊:
返回issubclass(cls.\uuuuu原点,self.\uuuuu原点)
raise TypeError(“下标泛型不能与一起使用”)
“类和实例检查”)
现在调用
issubclass(typing.List,typing.List)
时,python调用此方法,因为这两个参数都是\u GenericAlias
和special(\u special=True
)的实例,所以该方法将输入以下分支:返回issubclass(cls.\u origin\u,self.\u origin\u)
self\uuuu origin\uuuu
是内置类型列表
。
因此调用issubclass(typing.List,typing.List)
最终是调用issubclass(List,List)
。这意味着您检查的不是真正的typing.List
ifself,而是表示内置类型
调用issubclass(typing.List,List)
时,将输入分支返回issubclass(cls,self.\uu origin\uuuu)
(因为参数cls
是List
,而这不是\u GenericAlias
的实例)。因此,它的结果同样与issubclass(list,list)
相同
使用issubclass(typing.List,List)
调用List的\uuuu subasscheck\uuuu
方法(调用与List.\uuuu subasscheck\uuuuu(typing.List)
)
现在失败了,因为子类检查需要两个属于类而不是实例的参数。但是typing.List
是\u GenericAlias
的一个实例,而不是一个类。所以这失败了,出现了一个TypeError
,谢谢你解释了这一点,破坏了我对'issubclass():'的天真信念