我发现在Python中qux = foo;
qux = bar;
和collections.Iterable
都可以用于类型注释,并检查对象是否可迭代,即typing.Iterable
和isinstance(obj, collections.Iterable)
都可以工作。我的问题是,它们之间有什么区别?在哪种情况下首选哪个?
答案 0 :(得分:2)
typing.Iterable
是通用的,因此您可以在类型注释中说出它是可迭代的,例如Iterable[int]
获取整数。
可迭代的集合是一个抽象基类。这些可以包括extra mixin methods,以便在创建自己的子类时使接口更易于实现。
现在,Iterable
根本不包含任何这些mixin,但是它是其他抽象基类的接口的一部分。
从理论上讲,键入可迭代的方法都适用,但是它使用一些奇怪的元类魔术来做到这一点,因此它们在所有情况下的行为都不完全相同。您实际上在运行时不需要泛型,因此无需在类型注释等之外使用泛型。可迭代的集合作为超类不太可能引起问题。
因此,简而言之,您应该在类型注释中使用可迭代的类型输入,但将可迭代的集合用作超类。