isinstance 如何为 List 工作?
How does isinstance work for List?
我正在尝试了解 Python 的类型注释是如何工作的(例如 List
和 Dict
- 而不是 list
或 dict
)。具体来说,我对 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,进一步讨论开发人员如何考虑如何为复杂的自定义 类 提供更好的支持,这些自定义可能会或可能不会实现足够的方法被视为 mapping 或 sequence 或类似的。
我正在尝试了解 Python 的类型注释是如何工作的(例如 List
和 Dict
- 而不是 list
或 dict
)。具体来说,我对 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,进一步讨论开发人员如何考虑如何为复杂的自定义 类 提供更好的支持,这些自定义可能会或可能不会实现足够的方法被视为 mapping 或 sequence 或类似的。