[Python-ideas] Introduce collections.Reiterable

Stephen J. Turnbull stephen at xemacs.org
Fri Sep 20 19:34:58 CEST 2013


Andrew Barnert writes:

 > And that makes me think that I (and the people who have been
 > responding to you before me) have missed something important in
 > this "manually iterable" or "directly iterable" idea. So, maybe you
 > should try explaining it a different way?

How about "'Iterable' is a terrible name for an ABC that excludes an
important class of iterables"?

You see, the library manual lies (section 4.5 "Iterator types"):

    One method needs to be defined for container objects to provide
    iteration support:

    container.__iter__()

But in fact this is contradicted (section 2 "Built-in functions"):

    iter(object[, sentinel])
        Return an iterator object. The first argument is interpreted very
        differently depending on the presence of the second argument. Without
        a second argument, object must be a collection object which supports
        the iteration protocol (the __iter__() method), or it must support the
        sequence protocol (the __getitem__() method with integer arguments
        starting at 0).

I suggest that section 4.5 be corrected to

    Container objects provide iteration support when either of the methods

    container.__iter__()            # iteration protocol
    container.__getitem__()         # sequence protocol

    is defined.  In the latter case, __getitem__() must accept integer
    arguments starting at 0.

Curiously, all of the built-in sequences support both protocols.  I
suppose this section ought to say which is preferred.

The net result is that I guess Nick's test needs to be refined to

    def isIterable(o):
        try:
            iter(o)
            return True
        except TypeError:
            return False

    def isReiterable(o):
        return isIterable and not isinstance(o, collections.abc.Iterator)



More information about the Python-ideas mailing list