gpt4 book ai didi

python - isinstance 如何为 List 工作?

转载 作者:太空狗 更新时间:2023-10-29 18:30:14 26 4
gpt4 key购买 nike

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

我看到 List 定义为:

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

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

最佳答案

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

如果你想提供自己的泛型,你真的很想研究typing module source code ,具体如何GenericMetaGeneric用于定义其他通用类型,如 List;大多数此类检查委托(delegate)给 abc.ABCMeta.__subclasshook__ .你可以用这样的钩子(Hook)定义你自己的 ABC,然后定义一个子类化它的 Generic。

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

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

关于python - isinstance 如何为 List 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44133058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com