[Python-3000] Builtin iterator type
Brian Harring
ferringb at gmail.com
Tue Nov 14 01:52:53 CET 2006
On Mon, Nov 13, 2006 at 01:44:10PM -0500, George Sakkis wrote:
> As a proof of concept, I provide below a sample implementation of how
> I imagine this type to work (also posted in the original c.l.py.
> thread):
>
> from itertools import chain, tee, islice
>
> import __builtin__
> _builtin_iter = __builtin__.iter
>
> class iter(object):
>
> def __init__(self, iterable):
> self._it = _builtin_iter(iterable)
>
> def __iter__(self):
> return self
> def next(self):
> return self._it.next()
>
> def __getitem__(self, index):
> if isinstance(index, int):
> try: return islice(self._it, index, index+1).next()
> except StopIteration:
> raise IndexError('Index %d out of range' % index)
> else:
> start,stop,step = index.start, index.stop, index.step
> if start is None: start = 0
> if step is None: step = 1
> return islice(self._it, start, stop, step)
Tend to think __getitem__ on base iter is a rather bad idea due to the
fact it implies the underlying iter is a mapping; it's not.
Additionally... islice *does* have issues when working against an
iterator that hasn't been protected via tee; that's not a complaint
against islice mind you, it's just reality that if you islice an
iterator, make damn sure you pull from that islice before going
back to the original iterator; intermixing them is a grand way to
shoot yourself in the foot.
Current usage, it's easy to spot it (look for islice); overloading
getitem however means it gets far harder, thus more likely to trip
folks up (in my opinion).
> def __add__(self, other):
> return chain(self._it, other)
The change to the iterator protocol here, that iter1 + iter2 ==
chain(iter1, iter2) breaks down for self iterating types; trying to
shoe horn in add/radd means that for self-iters, add/radd/mul are now
taken away from them.
Duck typing works (imo) when the hook points all behave similiar; not
convinced that abusing __add__ is wise, definitely not convinced
__getitem__ is sane, especially since islice doesn't guarntee that
it'll return that specific slice- just gurantees that it'll follow a
specific pattern for consuming from the wrapped iter.
So... nuking those, you wind up with existing iter. Perhaps providing
sane examples of __getitem__ usage would help; add sort of makes sense
sans it getting whacky for self-iters.
~harring
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://mail.python.org/pipermail/python-3000/attachments/20061113/018cee7e/attachment.pgp
More information about the Python-3000
mailing list