[Python-Dev] itertools addition: getitem()

Raymond Hettinger python at rcn.com
Mon Jul 9 00:40:17 CEST 2007


[Walter Dörwald]
> I'd like to propose the following addition to itertools: A function
> itertools.getitem() which is basically equivalent to the following
> python code:
>
> _default = object()
>
> def getitem(iterable, index, default=_default):
>    try:
>       return list(iterable)[index]
>    except IndexError:
>       if default is _default:
>          raise
>       return default
>
> but without materializing the complete list. Negative indexes are
> supported too (this requires additional temporary storage for abs(index)
> objects).

Why not use the existing islice() function?

   x = list(islice(iterable, i, i+1)) or default

Also, as a practical matter, I think it is a bad idea to introduce
__getitem__ style access to itertools because the starting point
moves with each consecutive access:

    # access items 0, 2, 5, 9, 14, 20, ...
    for i in range(10):
        print getitem(iterable, i)

Worse, this behavior changes depending on whether the iterable
is re-iterable (a string would yield consecutive items while a
generator would skip around as shown above).

Besides being a bug factory, I think the getitem proposal would
tend to steer people down the wrong road, away from more
natural solutions to problems involving iterators.  A basic step
in learning the language is to differentiate between sequences
and general iterators -- we should not conflate the two.


Raymond


More information about the Python-Dev mailing list