[英]How does isinstance work for List?
我试图理解Python的类型注释是如何工作的(例如List
和Dict
- not list
or dict
)。 具体来说,我对isinstance(list(), List)
如何工作感兴趣,这样我就可以创建自己的自定义注释。
我看到List
被定义为:
class List(list, MutableSequence[T], extra=list):
. . .
我熟悉metaclass = xxx
但我找不到有关此extra = xxx
任何文档。 这是一个关键字还是一个参数,如果是这样的话,它来自哪里,它会做我想要的事情? 是否与isinstance
相关?
isinstance()
和issubclass()
在object.__instancecheck__()
和object.__subclasscheck__()
中有挂钩 , typing
泛型也使用。
如果你想提供自己的泛型,你真的想学习typing
模块源代码 ,特别是如何使用GenericMeta
和Generic
来定义其他通用类型,如List
; 大多数此类检查都委托给abc.ABCMeta.__subclasshook__
。 您可以使用这样的钩子定义自己的ABC,然后定义一个子类化它的Generic。
这里的GenericMeta
元类也给出了extra
关键字参数含义。 这样的内部结构仍然很少被记录,因为typing
实现仍在不断变化,该模块仍然是临时的 。 extra
参数存储为__extra__
,用于自定义__subclasshook__
实现 ; 对于extra=list
它简单地归结为将isinstance(something, List)
为isinstance(something, list)
。
请注意,对运行时检查的支持是故意限制的; 静态类型检查器实际上不会运行这些钩子。 请参阅mypy跟踪器中的结构子类型讨论 ,以进一步讨论开发人员如何考虑如何为复杂的自定义类提供更好的支持,这些自定义类可能会或可能不会实现足以被视为映射或序列或类似的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.