[Python-Dev] itertools addition: getitem()
python at rcn.com
Mon Jul 9 00:40:17 CEST 2007
> 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):
> return list(iterable)[index]
> except IndexError:
> if default is _default:
> return default
> but without materializing the complete list. Negative indexes are
> supported too (this requires additional temporary storage for abs(index)
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.
More information about the Python-Dev