isinstance 如何为 List 工作?

Posted

技术标签:

【中文标题】isinstance 如何为 List 工作?【英文标题】:How does isinstance work for List? 【发布时间】:2017-10-23 07:16:44 【问题描述】:

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

我看到List被定义为:

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

我对@9​​87654328@ 很熟悉,但我找不到关于此extra = xxx 的任何文档。这是一个关键字还是只是一个参数,如果是,它来自哪里,它是否符合我的要求?它甚至与isinstance 相关吗?

【问题讨论】:

它没有被记录的事实要么意味着a)它不是公共API的一部分,要么b)它被遗忘了;我这里倾向于第一个。查看typing 的源代码,您可以看到extra 已用于,我引用:“构造一个__subclasshook__ 可调用对象,在针对cls 执行的子类检查中合并关联的__extra__ 类。”跨度> 顺便说一句,您的标题和问题真的不匹配。看来您的问题确实涉及extras 在isinstance 中的角色,而不是广义上的isinstance 的工作原理。 【参考方案1】:

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

如果你想提供自己的泛型,你真的很想研究typing module source code,特别是GenericMetaGeneric是如何定义其他泛型类型的,比如List;大多数此类检查都委托给abc.ABCMeta.__subclasshook__。你可以用这样的钩子定义你自己的 ABC,然后定义一个继承它的 Generic。

这里的GenericMeta 元类也赋予了extra 关键字参数含义。由于typing 的实现仍在不断变化,因此此类内部结构的文档仍然很少,模块仍然是provisionalextra 参数存储为__extra__ 并在custom __subclasshook__ implementation 中使用;对于extra=list,只需将isinstance(something, List) 转换为isinstance(something, list)

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

【讨论】:

以上是关于isinstance 如何为 List 工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 state_is_tuple = True 设置 RNN?

是:如何为is创建单独的.babelrc文件

如何为vim设置合成?

如何为 List<Class name> 创建 JSONArray

C# 如何为 List<T> 动态分配内存?

如何为 Like 创建 System.Linq.Expressions.Expression?