CodeQL documentation

Iterator does not return self from __iter__ method

ID: py/iter-returns-non-self Kind: problem Security severity: Severity: error Precision: high Tags: - reliability - correctness - quality Query suites: - python-code-quality.qls - python-security-and-quality.qls 

Click to see the query in the CodeQL repository

Iterator classes (classes defining a __next__ method) should have an __iter__ method that returns the iterator itself. This ensures that the object is also an iterable; and behaves as expected when used anywhere an iterator or iterable is expected, such as in for loops.

Recommendation

Ensure that the __iter__ method returns self, or is otherwise equivalent as an iterator to self.

Example

In the following example, the MyRange class’s __iter__ method does not return self. This would lead to unexpected results when used with a for loop or in statement.

class MyRange(object): def __init__(self, low, high): self.current = low self.high = high def __iter__(self): return (self.current, self.high) # BAD: does not return `self`. def __next__(self): if self.current > self.high: return None self.current += 1 return self.current - 1 

References