[Python-Dev] Re: PEP 322: Reverse Iteration
Alex Martelli
aleaxit at yahoo.com
Wed Nov 5 11:09:14 EST 2003
On Wednesday 05 November 2003 03:54 pm, Phillip J. Eby wrote:
...
> >reverse iteration. The iterator object has no way of knowing in advance
> >that it is going to be called by reversed().
>
> Why not change enumerate() to return an iterable, rather than an
> iterator? Then its __reversed__ method could attempt to delegate to the
> underlying iterable. Is it likely that anyone relies on enumerate() being
> an iterator, rather than an iterable?
I do rely on the _argument_ of enumerate being allowed to be just any
iterator, yes -- e.g. in such idioms as:
for i, x in enumerate(xs):
if isgoodenough(x): return x
elif istoohigh(i): raise GettingBoredError, i
Yes, I _could_ recode that as:
i = 0
for x in xs:
if isgoodenough(x): return x
i += 1
if istoohigh(i): raise GettingBoredError, i
but, I don't _wanna_...:-). enumerate is just too slick!
Of course, it would be fine for reverse(enumerate(x)) to fail for unsuitable
values of x -- that's a separate issue.
But actually it would not be a tragedy if I couldn't reverse(enumerate --
e.g. where I'd LIKE to code:
for i, x in reverse(enumerate(xs)):
if isbad(x): raise BadXError, x
xs[i] = transform(x)
I _might_ reasonably code:
for i, x in enumerate(reverse(xs)):
if isbad(x): raise BadXError, x
xs[-1-i] = transform(x)
that -1-i may not be the prettiest sight in the world, but I think this STILL
beats the alternative of:
for i in reversed_range(len(xs)):
x = xs[i]
if isbad(x): raise BadXError, x
xs[i] = transform(x)
not to mention today's
for i in xrange(-1, -len(xs)-1, -1):
x = xs[i]
if isbad(x): raise BadXError, x
xs[i] = transform(x)
or:
for i in xrange(len(xs)-1, -1, -1):
x = xs[i]
if isbad(x): raise BadXError, x
xs[i] = transform(x)
Alex
More information about the Python-Dev
mailing list