集合。迭代与打字。在类型注释中迭代并检查Iterable

时间:2018-10-16 03:14:38

标签: python types annotations iterable isinstance

我发现在Python中qux = foo; qux = bar; collections.Iterable都可以用于类型注释,并检查对象是否可迭代,即typing.Iterableisinstance(obj, collections.Iterable)都可以工作。我的问题是,它们之间有什么区别?在哪种情况下首选哪个?

1 个答案:

答案 0 :(得分:2)

typing.Iterable是通用的,因此您可以在类型注释中说出它是可迭代的,例如Iterable[int]获取整数。

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

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

从理论上讲,键入可迭代的方法都适用,但是它使用一些奇怪的元类魔术来做到这一点,因此它们在所有情况下的行为都不完全相同。您实际上在运行时不需要泛型,因此无需在类型注释等之外使用泛型。可迭代的集合作为超类不太可能引起问题。

因此,简而言之,您应该在类型注释中使用可迭代的类型输入,但将可迭代的集合用作超类。