[Python-Dev] PEP 0424: A method for exposing a length hint
Mark Shannon
mark at hotpy.org
Sun Jul 15 17:08:00 CEST 2012
Brett Cannon wrote:
>
>
> On Sun, Jul 15, 2012 at 10:39 AM, Mark Shannon <mark at hotpy.org
> <mailto:mark at hotpy.org>> wrote:
>
> Nick Coghlan wrote:
>
> Right, I agree on the value in being able to return something to
> say "this cannot be converted to a concrete container".
>
> I still haven't seen a use case where the appropriate response
> to "I don't know" differs from the appropriate response to a
> hint of zero - that is, you don't preallocate, you just start
> iterating.
>
>
> There seem to be 5 possible classes values of __length_hint__ that an
> iterator object can provide:
>
> 1. Don't implement it at all.
>
> 2. Implement __length_hint__() but don't want to return any value.
> Either raise an exception (TypeError) -- As suggested in the PEP.
> or return NotImplemented -- my preferred option.
>
> 3. Return a "don't know" value:
> Returning 0 would be fine for this, but the VM might want to respond
> differently to "don't know" and 0.
> __length_hint__() == 0 container should be
> minimum size.
> __length_hint__() == "unknown" container starts at
> default size.
>
>
> 4. Infinite iterator:
> Could return float('inf'), but given this is a "hint" then
> returning sys.maxsize or sys.maxsize + 1 might be OK.
> Alternatively raise an OverflowError
>
>
> I am really having a hard time differentiating infinity with "I don't
> know" since they are both accurate from the point of view of
> __length_hint__ and its typical purpose of allocation. You have no clue
> how many values will be grabbed from an infinite iterator, so it's the
> same as just not knowing upfront how long the iterator will be, infinite
> or not, and thus not worth distinguishing.
>
>
>
> 5. A meaningful length. No problem :)
>
> Also, what are the allowable return types?
>
> 1. int only
> 2. Any number (ie any type with a __int__() method)?
> 3. Or any integer-like object (ie a type with a __index__() method)?
>
> My suggestion:
>
> a) Don't want to return any value or "don't know": return NotImplemented
> b) For infinite iterators: raise an OverflowError
> c) All other cases: return an int or a type with a __index__() method.
>
>
> I'm fine with (a), drop (b), and for (c) use what we allow for __len__()
> since, as Nick's operator.length_hint pseudo-code suggests, people will
> call this as a fallback if __len__ isn't defined.
So how does an iterator express infinite length?
What should happen if I am silly enough to do this:
>>> list(itertools.count())
This will fail; it should fail quickly.
Cheers,
Mark.
More information about the Python-Dev
mailing list