gpt4 book ai didi

python - collections.Iterable vs typing.Iterable 在类型注释和检查 Iterable

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:53 29 4
gpt4 key购买 nike

我发现在 Python 中 collections.Iterabletyping.Iterable 都可以用于类型注释和检查对象是否可迭代,即 >isinstance(obj, collections.Iterable)isinstance(obj, typing.Iterable) 有效。我的问题是,它们之间有什么区别?在哪些情况下首选哪个?

最佳答案

由于PEP 585 - Type Hinting Generics In Standard Collections , Python 的标准库容器类型也能够接受类型注释的泛型参数。这包括 collections.abc.Iterable 类。

当仅支持 Python 3.9 或更高版本时,不再有任何理由使用 typing.Iterable 并且从 typing 导入任何这些容器类型已被弃用.

对于旧的 Python 版本:

typing.Iterable 是通用的,因此您可以在类型注释中说明它是什么可迭代对象,例如Iterable[int] 用于可迭代的整数。

可迭代集合是一个抽象基类。这些可以包括 extra mixin methods在您创建自己的子类时使接口(interface)更易于实现。

现在碰巧 Iterable 不包含任何这些 mixin,但它是其他抽象基类的接口(interface)的一部分。

从理论上讲,键入可迭代对象对两者都有效,但它使用了一些奇怪的元类魔术来做到这一点,因此它们在所有情况下的行为方式都不完全相同。在运行时你真的不需要泛型,所以没有必要在类型注释等之外使用它。作为父类(super class),可迭代集合不太可能引起问题。

所以简而言之,您应该在类型注释中使用类型可迭代对象,但集合可迭代对象作为父类(super class)。

关于python - collections.Iterable vs typing.Iterable 在类型注释和检查 Iterable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52827463/

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