为什么List [str]不是Sequence [str]的子类

时间:2016-07-17 20:41:38

标签: python python-3.x type-hinting

ListSequence的子类:

>>> from typing import List, Sequence
>>> issubclass(List, Sequence)
True

List[str]不是Sequence[str]的子类:

>>> issubclass(List[str], Sequence[str])
False

为什么?

1 个答案:

答案 0 :(得分:0)

  

注释时List[str]Sequence[str]之间的IS-A关系会有什么用处?

这是要带走的重点。检查类型是否是另一种类型的子类型通常不是在键入注释代码时应该做的事情。这通常是被注意到的事情,也是为什么会对the nuking of __subclasscheck__进行辩论的原因。

作为马克香农states in a comment

  

检查类型是否是类型的子类型是有意义的,但这是静态检查器的作用,并且不属于键入模块。

无论哪种方式,检查都是all made in GenericMetas __subclasscheck__,泛型类型的元类

按原样,当前实现更侧重于容器类型相似但子脚本类型不同的情况,在这种情况下,将根据子脚本类型是否为covariant or contravariant进行检查。例如,List类型既不会检查subtype关系:

issubclass(List[bool], List[int])  # checks if bool == int  

返回false。对于序列,类型是协变的,因此,以下产生True

issubclass(Sequence[bool], Sequence[int])  # checks if bool is a subclass of int

另一方面,对于没有指定类型的类型(如第一种情况):

issubclass(List, Sequence)
__subclasscheck__中的{p> GenericMetadelegate __subclasscheck__ in ABCMeta issubclass call is an instance of GenericMeta评估为True

最后,如果两种类型不同,如:

issubclass(List[str], Sequence[str])

并返回link中的基类,False; typing中的大多数类型都满足此条件。

无论如何,值得一提的是,未来版本中可能不存在这种情况,或者它的行为可能完全不同;该模块仍然是临时的。