[Python-Dev] PEP 0424: A method for exposing a length hint (original) (raw)

Brett Cannon brett at python.org
Sun Jul 15 16:47:09 CEST 2012


On Sun, Jul 15, 2012 at 10:39 AM, Mark Shannon <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 lengthhint that an iterator object can provide: 1. Don't implement it at all. 2. Implement lengthhint() 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. lengthhint() == 0 container should be minimum size. lengthhint() == "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.

-Brett

Cheers, Mark.

_______** Python-Dev mailing list Python-Dev at python.org http://mail.python.org/**mailman/listinfo/python-dev<http://mail.python.org/mailman/listinfo/python-dev> Unsubscribe: http://mail.python.org/mailman/options/python-dev/ brett%40python.org<http://mail.python.org/mailman/options/python-dev/brett%40python.org> -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.python.org/pipermail/python-dev/attachments/20120715/34922c83/attachment.html>



More information about the Python-Dev mailing list