[Python-ideas] Introduce collections.Reiterable

Terry Reedy tjreedy at udel.edu
Fri Sep 20 23:15:05 CEST 2013


On 9/20/2013 5:48 AM, Steven D'Aprano wrote:

> py> class Seq:
> ...     def __getitem__(self, index):
> ...             if 0 <= index < 5: return index+1000
> ...             raise IndexError
> ...
> py> s = Seq()
> py> isinstance(s, Iterable)
> False
> py> list(s)  # definitely iterable
> [1000, 1001, 1002, 1003, 1004]

I tested and iter() recognizes Seqs as iterables:

for i in iter(Seq()): print(i)
<same numbers as above>

It does, however, wrap them in an adaptor iterator class
 >>> type(iter(Seq()))
<class 'iterator'>
(which I was not really aware of before ;-) with proper __iter__ and 
__next__ methods
 >>> si is iter(si)
True
 >>> next(si)
1000

So I agree that collections.Iterable is limited relative to glossary and 
Python definition. The glossary might say that the older __getitem__ 
protocol is semi-deprecated (it is no longer used directly) but is 
adapted for back compatibility. The problem with the protocol is that an 
iteration __getitem__ may be a fake __getitem__ in that it ignores 
*index* (because it calculates the next item from stored data). A 
fake-getitem iterable, if it also had __len__, would look like a 
Sequence even though it really is not, because it cannot be properly 
indexed. Such iterables are likely to not be reiterable.

-- 
Terry Jan Reedy



More information about the Python-ideas mailing list