(original) (raw)
On Sun, Jul 15, 2012 at 10:39 AM, Mark Shannon <mark@hotpy.org> wrote:
Nick Coghlan wrote:There seem to be 5 possible classes values of \_\_length\_hint\_\_ that an
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.
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.
-Brett
Cheers,
Mark.
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: http://mail.python.org/mailman/options/python-dev/brett%40python.org