[Python-Dev] Re: PEP 322: Reverse Iteration

Guido van Rossum guido at python.org
Wed Nov 5 13:43:16 EST 2003

> > Yes.  I'm getting cold feet about __reversed__.
> What can I do to warm those feet?
> I spent a month making this proposal as perfect as possible, gathering
> support for it, trying each proposed modification, and enduring what
> feels like hazing.  Still, there is a little bit of energy left if that
> what it takes to put the ball over the goal line.
> Getting this far hasn't been easy.  Python people are quick to express
> negativity on just about anything and they take great pleasure is
> exploring every weird variant they can think of.  

I'm okay with adding reversed() as a builtin that works for sequences
only but I'm not okay with adding the __reversed__ protocol.

For me, the main advantage of reversed() is that it expresses better
what I mean when I'm going over a list (or other concrete sequence)
backwards.  The __reversed__ protocol muddles the issue by inviting to
try to make reversed() work for some iterators; I don't see the use
case (or if I do see it, I see it as much less important than the
previous one).

> > I also still think that a reversed [x]range() would give us a bigger
> > bang for the buck 
> I'm not willing to go that route:
> * Several posters gave negative feedback on that option.
> * It doesn't address the ugly and inefficient s[::-1] approach which I
> really do not want to become *the* idiom.
> * Providing yet another variant of xrange() is a step backwards IMO.
> * It is not an extensible protocol like the reversed() / __reversed__
> pair.
> * Except for the simple case of revrange(n), the multiple argument forms
> are not a simplification (IMO) and are still difficult to visually
> verify (try the example from random.shuffle).
> * A unique benefit to python is the ability to loop over containers
> without using indices.  The current proposal supports that idea.  The
> revrange() approach doesn't.

Points well taken.  About your last bullet, I wonder if one of the
issues is that when doing a forward loop over a container, we don't
really care that much about the order as long as we get all items
(witness the popularity of looping over dicts).  But when doing a
reverse loop, we clearly *do* care about the order.  So forward and
reverse iteration are not symmetric.  This may explains why 3 out of 5
examples you found *need* the index.

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

More information about the Python-Dev mailing list