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():'的天真信念