迭代器未从 __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
迭代器的 __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
参考¶
Python 语言参考:object.iter.
Python 标准库:迭代器.