Iterator Types
The iterator type in RPython is similar with Python, it can help to iterator
over containers. The iterator objects should support __iter__()
and
next()
methods. These two methods form the iterator protocol.
class Counter():
c = 100
def __iter__(self):
return self
def next(self):
t = self.c
self.c += 1
return t
def iterator():
l = [1, 2, 3, 4, 5]
it = iter(l) # return an iterator object on the list l
print it.next() # get next item from the list
c = Counter()
it = c.__iter__()
print it.next()
print next(it)
def iterator_unsupported():
l = [1, 2, 3, 4, 5]
# __iter__() method for list is not supported in RPython
it = l.__iter__()
print it.next()
def entry_point(argv):
iterator()
return 0
def target(*args): return entry_point
if __name__ == "__main__":
import sys
entry_point(sys.argv)
iterator_unsupported()
Attention
You cannot get an iterator object of a list using the __iter__()
method
in RPython.
If a container object’s __iter__()
method is implemented as a generator, it
will automatically return an iterator object with the __iter__()
and
next()
method. Here is an example of a customized container object
implemented the iterator protocol using generator.
class Box():
content = []
def add(self, cat):
self.content.append(cat)
def __iter__(self):
for i in self.content:
yield i
def iterator_generator():
b = Box()
b.add("Tiger")
b.add("Kitty")
it = b.__iter__()
print it.next()
for i in b:
print i
def entry_point(argv):
iterator_generator()
return 0
def target(*args): return entry_point
if __name__ == "__main__": import sys; entry_point(sys.argv)