isinstance 如何为 List 工作?

How does isinstance work for List?

我正在尝试了解 Python 的类型注释是如何工作的(例如 ListDict - 而不是 listdict)。具体来说,我对 isinstance(list(), List) 的工作原理很感兴趣,这样我就可以创建自己的自定义注释。

我看到 List 定义为:

class List(list, MutableSequence[T], extra=list):
    . . .

我熟悉 metaclass = xxx,但我找不到关于此 extra = xxx 的任何文档。这是一个关键字还是只是一个参数,如果是,它从哪里来,它做我想做的事吗?它甚至与 isinstance 相关吗?

isinstance()issubclass()object.__instancecheck__() and object.__subclasscheck__() 中有 钩子 typing 泛型也使用。

如果你想提供自己的泛型,你真的很想研究typing module source code, specifically how GenericMeta and Generic are used to define the other Generic types like List; mostly such checks are delegated to abc.ABCMeta.__subclasshook__。你可以用这样的钩子定义你自己的ABC,然后定义一个sub类它的Generic。

这里的GenericMeta元类也赋予了extra关键字参数意义。由于 typing 实现仍在不断变化,该模块仍然是 provisional. The extra argument is stored as __extra__ and is used in a custom __subclasshook__ implementation;对于 extra=list,它简单地归结为将 isinstance(something, List) 翻译成 isinstance(something, list)

请注意,对 运行 时间检查的支持是有意限制的;静态类型检查器实际上不会 运行 那些钩子。请参阅 mypy 跟踪器中的 structural subtyping discussion,进一步讨论开发人员如何考虑如何为复杂的自定义 类 提供更好的支持,这些自定义可能会或可能不会实现足够的方法被视为 mappingsequence 或类似的。