[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