[Python-Dev] Single- vs. Multi-pass iterability

Guido van Rossum guido@python.org
Tue, 16 Jul 2002 21:29:55 -0400


> An aside on "next" vs. "__next__":
> 
> Note that this convention would also suggest that "next" should be
> called "__next__", since "for" calls "next" implicitly.  I forget
> why we ended up going with "next" instead of "__next__".  I think
> "__next__" would have been better, especially in light of this:
> 
> Tim Peters wrote:
> > Requiring *some* method with a reserved name is an aid to
> > introspection, lest it become impossible to distinguish, say,
> > an iterator from an instance of a doubly-linked list node class
> > that just happens to supply methods named .prev() and .next()
> > for an unrelated purpose.
> 
> This is exactly why the iterator protocol should consist of one
> method named "__next__" rather than two methods named "__iter__"
> (which has nothing to do with the act of iterating!) and "next"
> (which is the one we really care about, but can collide with
> existing method names).
> 
> As far as i know, "next" is the only implicitly-called method of
> an internal protocol that has no underscores.  It's a little late
> to fix the name of "next" in Python 2, though it might be worth
> considering for Python 3.

Yup.  I regret this too.  We should have had a built-in next(x) which
calls x.__next__().  I think that if it had been __next__() we
wouldn't have the mistake that I just discovered -- that all the
iterator types that define a next() method shouldn't have done so,
because you get one automatically which is the tp_iternext slot
wrapped. :-(

But yes, it's too late to change now.

--Guido van Rossum (home page: http://www.python.org/~guido/)