This rule raises an issue when the object returned by __iter__ is not a valid iterator.
An iterable object is an object capable of returning its members one at a time.
To do so, it must define an __iter__ method that returns an iterator.
The iterator protocol specifies that, in order to be a valid iterator,
an object must define a __next__ and an __iter__ method (because iterators are also iterable).
Defining an __iter__ method that returns anything else than an iterator will raise a TypeError as soon as the iteration
begins.
Note that generators and generator expressions have both __next__ and
__iter__ methods generated automatically.
Make sure that the __iter__ method returns a valid iterator.
class MyIterable:
def __init__(self, values):
self._values = values
def __iter__(self):
return None # Noncompliant: Not a valid iterator
class MyIterable:
def __init__(self, values):
self._values = values
def __iter__(self):
return MyIterator(self._values)
class MyIterator:
def __init__(self, values):
self._values = values
self._index = 0
def __next__(self):
if self._index >= len(self._values):
raise StopIteration()
value = self._values[self._index]
self._index += 1
return value
def __iter__(self):
return self