On 12/17/2012 06:27 PM, Ethan Furman wrote: > Dave Angel wrote: >> On 12/17/2012 09:33 AM, Skip Montanaro wrote: >>> What method(s) does a class have to support to properly emulate a >>> container >>> which supports turning it into a list? For example: >>> >>> class Foo: >>> pass >>> >>> f = Foo() >>> print list(f) >>> >>> Is it just __iter__() and next()? (I'm still using 2.4 and 2.7.) >> >> I believe the container class needs to define the __iter__() method, >> which has to return an iterator object. >> >> That (possibly different) iterator class needs both an __iter__() method >> and a next() method. >> >> If the container class is also the iterator class, which is common, then >> you just need one __iter__() method, which returns self. > > The `next()` method is also needed, as `__iter__()` and `next()` are the > two methods that make up the iterator protocol (`__next__` in python 3k). > > ~Ethan~ > >
Didn't I say that? The next() method need not be in the container class; it needs to be in the iterator class returned by the __iter__() method. class MyIter(): def __init__(self, value): self.internal = value def __iter__(self): return self def next(self): self.internal += 1 if self.internal > 100: raise StopIteration return self.internal class Container: def __iter__(self): return MyIter(42) for item in Container(): print item print list(Container()) (tested in Python 2.7) AHH, upon rereading, I see you misinterpreted what I meant. I was trying to say that if there was only one class serving as both container and iterator, you only needed one of the __iter__() methods instead of two. In other words, you need two methods, not three. -- DaveA -- http://mail.python.org/mailman/listinfo/python-list