Supporting list()
Dave Angel
d at davea.name
Mon Dec 17 11:14:03 EST 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