我正在使用一个名为queue的自定义类,它使用迭代器。我在一个名为iterator.py的单独文件中有一个Iterator class
。当我尝试使用for循环迭代时,我收到以下错误。
from iterator import Iterator
class Abstractstruc(object):
def __init__(self):
assert False
def __str__(self):
return "<%s: %s>" %(self.__class__.__name__,self.container)
class Queue(Abstractstruc,Iterator):
def __init__(self, objecttype=object):
self.container=[]
self.size=0
def add(self, data):
self.container.append(data)
def remove(self):
self.container.pop(0)
def __getitem__(self,index):
return self.container[index]
def __iter__(self):
return Iterator(self.container)
if __name__=='__main__':
q=Queue(int)
q.add(5)
q.add(4)
q.add(6)
for i in q:
print i
iterator.py
class Iterator(object):
def __init__(self, wrapped):
self.wrapped = wrapped
self.offset = 0
def __next__(self):
if self.offset>=len(self.wrapped):
raise StopIteration
else:
item = self.wrapped[self.offset]
self.offset+=1
return item
我收到此错误消息
<Queue: [5, 4, 6]>
<Queue: [4, 6]>
4
Traceback (most recent call last):
File "queue.py", line 78, in <module>
for i in q:
TypeError: iter() returned non-iterator of type 'Iterator'
我不明白为什么它不返回迭代器。需要什么修复?
答案 0 :(得分:3)
迭代器必须自己实现__iter__
。他们可以返回self
。从docs开始,请注意自定义迭代器对象必须支持__iter__
才能支持for
和in
语句。另外,正如@Robᵩ所说,由于您使用的是Python 2而不是3,因此您需要实现next()
,而不是__next__()
。
答案 1 :(得分:1)
那是因为next()
方法不应该是魔术,你不需要双重下划线。如前所述,Python 3是不同的。
def next(self):