CodeQL 文档

迭代器未从 __iter__ 方法返回 self

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

单击以在 CodeQL 存储库中查看查询

迭代器的 __iter__ 方法应返回 self。这很重要,因为迭代器可以在任何期望序列的上下文中用作序列。要做到这一点,需要 __iter__ 对迭代器是幂等的。

请注意,序列和映射应返回新的迭代器,只是返回的迭代器必须遵守此约束。

建议

使 __iter__ 返回 self,除非类不应是迭代器,在这种情况下将 next(Python 2)或 __next__(Python 3)重命名为其他内容。

示例

在此示例中,Counter 类的 __iter__ 方法不返回 self(甚至不返回迭代器)。这将导致程序在任何人尝试在 for 循环或 in 语句中使用迭代器时失败。

class MyRange(object):
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return self.current

    def next(self):
        if self.current > self.high:
            raise StopIteration
        self.current += 1
        return self.current - 1

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私