Supporting list()

Dave Angel d at davea.name
Mon Dec 17 17:14:03 CET 2012


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



More information about the Python-list mailing list