Peek inside iterator (is there a PEP about this?)

Peter Otten __peter__ at web.de
Wed Oct 1 13:14:14 EDT 2008


Luis Zarrabeitia wrote:

> For most use cases I think about, the iterator protocol is more than
> enough. However, on a few cases, I've needed some ugly hacks.
> 
> Ex 1:
> 
> a = iter([1,2,3,4,5]) # assume you got the iterator from a function and
> b = iter([1,2,3])     # these two are just examples.

Can you provide a concrete use case?
 
> then,
> 
> zip(a,b)
> 
> has a different side effect from
> 
> zip(b,a)
> 
> After the excecution, in the first case, iterator a contains just [5], on
> the second, it contains [4,5]. I think the second one is correct (the 5
> was never used, after all). I tried to implement my 'own' zip, but there
> is no way to know the length of the iterator (obviously), and there is
> also no way to 'rewind' a value after calling 'next'.
> 
> Ex 2:
> 
> Will this iterator yield any value? Like with most iterables, a construct
> 
> if iterator:
>    # do something

I don't think this has a chance. By adding a __len__ to some iterators R.
Hettinger once managed to break GvR's code. The BDFL was not amused.
 
> would be a very convenient thing to have, instead of wrapping a 'next'
> call on a try...except and consuming the first item.
> 
> Ex 3:
> 
> if any(iterator):
>    # do something ... but the first true value was already consumed and
>    # cannot be reused. "Any" cannot peek inside the iterator without
>    # consuming the value.

for item in iflter(bool, iterator):
   # do something
   break

is not that bad.

> Instead,
> 
> i1, i2 = tee(iterator)
> if any(i1):
>    # do something with i2
> 
> Question/Proposal:
> 
> Has there been any PEP regarding the problem of 'peeking' inside an
> iterator? Knowing if the iteration will end or not, and/or accessing the
> next value, without consuming it? Is there any (simple, elegant) way
> around it?

Personally I think that Python's choice of EAFP over LBYL is a good one, but
one that cannot easily be reconciled with having peekable iterators. If I
were in charge I'd rather simplify the iterator protocol (scrap send() and
yield expressions) than making it more complex.

Peter



More information about the Python-list mailing list