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-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

  • © GitHub, Inc.
  • Terms
  • Privacy