[Python-ideas] iterable: next() and __iter__() -- and __reset()

Antoine Pitrou solipsis at pitrou.net
Fri Mar 5 00:54:05 CET 2010


Le Thu, 4 Mar 2010 11:35:53 +0100,
spir <denis.spir at gmail.com> a écrit :
> 
> (1) I do not understand an iterable type's __iter__() method to be
> compulsary. Actually, each time I have defined one, I had to write:
> def __iter__(self): return self
> So, I guess that if python does not find __iter__(), but the object
> defines next(), then by default the said object could be used as its
> own iterator.

Explicit is better than implicit, though.
In many non-trivial cases, the iterator will have to be a separate
object anyway.
Also, please note you can implement __iter__ as a generator, which
makes things very easy for the simple cases:

>>> class C(object):
...   def __iter__(self):
...     yield 1
...     yield 2
... 
>>> c = C()
>>> it = iter(c)
>>> it
<generator object __iter__ at 0xb746c0f4>
>>> next(it)
1
>>> next(it)
2
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> list(c)
[1, 2]

> (3) What I miss actually for iterables (which are their own iterator)
> is a kind of __reset__().

No, really, you don't want this, unless you like PHP. As others said,
calling iter() again is the well-defined generic way to "reset" your
iterable.
Then, particular cases can warrant specific APIs, such as file.seek().

Regards

Antoine.





More information about the Python-ideas mailing list