iter-method-return-iterable (PYI045)
源自 flake8-pyi 代码检查器。
作用
检查存根 (stub) 中 __iter__ 方法的返回值是否为 Iterable[T] 而不是 Iterator[T]。
为什么这不好?
__iter__ 方法应该始终返回某种类型的 Iterator,而不是 Iterable。
在 Python 中,Iterable 是具有 __iter__ 方法的对象;Iterator 是具有 __iter__ 和 __next__ 方法的对象。所有 __iter__ 方法都应返回 Iterator。如果对象的 __iter__ 方法没有返回 Iterator,类型检查器可能无法始终识别该对象为可迭代对象。
每个 Iterator 都是 Iterable,但并非每个 Iterable 都是 Iterator。例如,list 是 Iterable,但不是 Iterator;您可以通过将列表传递给 iter() 来获得列表元素的迭代器。
>>> import collections.abc
>>> x = [42]
>>> isinstance(x, collections.abc.Iterable)
True
>>> isinstance(x, collections.abc.Iterator)
False
>>> next(x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not an iterator
>>> y = iter(x)
>>> isinstance(y, collections.abc.Iterable)
True
>>> isinstance(y, collections.abc.Iterator)
True
>>> next(y)
42
使用 Iterable 而不是 Iterator 作为 __iter__ 方法的返回类型意味着您不一定能够对返回的对象调用 next(),这违反了接口的预期。
示例
建议改为