【发布时间】:2018-10-04 16:54:07
【问题描述】:
例如,假设我有一个用于迭代文件中记录的类:
class MySpecialFile:
...
def reset(self):
self._handle.seek(0)
def __iter__(self):
self.reset()
return self
编辑:
几个月后我才读到这个问题,我问了它,觉得有点愚蠢:)。
正如在下面的答案中所写,具有副作用的 __iter__ 方法是一件坏事。如果你想多次迭代你的对象,那么你只需要每次调用__iter__时返回一个新的迭代器对象:
class IterableFile:
def __iter__(self):
return FileIterator(self)
回想起来,这很明显,我想这就是我现在感到愚蠢的原因。不知道我在想什么,但我认为我不愿意拥有两个单独的类的原因是每个新的迭代器都需要创建一个新的文件处理程序(我的 SpecialFile 类只是文本/二进制文件之上的一个接口)当时我觉得这“过分”和奇怪。
【问题讨论】:
-
这将无法跳过前几条记录(可能是标题行),然后使用
for循环迭代文件的其余部分。 -
这会破坏各种事情。例如,itertools
consume配方,或使用iter来测试事物是否可迭代。看起来您正在尝试“修复”常见的文件上的两个循环错误,但这只会产生新问题。