迭代器未从 __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 标准库:迭代器.