繁体   English   中英

如何为List工作?

[英]How does isinstance work for List?

我试图理解Python的类型注释是如何工作的(例如ListDict - 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模块源代码 ,特别是如何使用GenericMetaGeneric来定义其他通用类型,如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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM