Mic*_*ein 11 python type-hinting python-3.x
List是以下的子类Sequence:
>>> from typing import List, Sequence
>>> issubclass(List, Sequence)
True
Run Code Online (Sandbox Code Playgroud)
但List[str]不是以下的子类Sequence[str]:
>>> issubclass(List[str], Sequence[str])
False
Run Code Online (Sandbox Code Playgroud)
为什么?
注释时
List[str]和之间的 IS-A 关系有什么用?Sequence[str]
这是要点。在对代码进行类型注释时,通常不应该检查一个类型是否是另一个类型的子类型。这通常是人们已经注意到的事情,也是人们对核武器__subclasscheck__进行争论的原因。
正如马克·香农在评论中所说:
检查类型是否是类型的子类型是有意义的,但这是静态检查器的工作,不属于打字模块。
无论哪种方式,检查都是在s(泛型类型的元类)中进行的GenericMeta__subclasscheck__
事实上,当前的实现更关注容器类型相似但其下标类型不同的情况,在这种情况下,根据下标类型是协变还是逆变进行检查。例如,List类型本身既不检查与以下各项的subtype关系:
issubclass(List[bool], List[int]) # checks if bool == int
Run Code Online (Sandbox Code Playgroud)
返回假。对于序列,类型是协变的,因此,产生以下结果True:
issubclass(Sequence[bool], Sequence[int]) # checks if bool is a subclass of int
Run Code Online (Sandbox Code Playgroud)
另一方面,对于没有指定类型的类型(如第一种情况):
issubclass(List, Sequence)
Run Code Online (Sandbox Code Playgroud)
__subclasscheck__inGenericMeta将委托给__subclasscheck__in ,ABCMeta其中它将评估为True。
最后,如果两种类型不同,如下所示:
issubclass(List[str], Sequence[str])
Run Code Online (Sandbox Code Playgroud)
并且调用中的基类issubclass是 的实例GenericMeta,False被返回;中的大多数类型都满足此条件typing。
不管怎样,值得一提的是,这可能在未来的版本中不存在,或者,它的行为可能完全不同;该模块仍然是临时的。
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |