On Sun, Jul 15, 2012 at 6:21 PM, Steven D'Aprano <st...@pearwood.info> wrote: > I suggest: > > * object (and hence all other types that don't explicitly override it) > should have a __length_hint__ that raises TypeError;
We can keep it simpler than that just by changing the order of the checks. > * __length_hint__ should be allowed to return None to indicate "don't know" > or -1 to indicate "infinite". > > Presumably anything that wishes to create a list or other sequence from an > object with a hint of -1 could then raise an exception immediately. I'm not seeing the value in returning None over 0 for the don't know case - it just makes the API harder to use. Declaring negative results as meaning "I'm infinite" sounds reasonable, though: def length_hint(obj): """Return an estimate of the number of items in obj. This is useful for presizing containers when building from an iterable. If the object supports len(), the result will be exact. Otherwise, it may over or underestimate by an arbitrary amount. """ try: get_hint = obj.__length_hint__ except AttributeError: return len(obj) hint = get_hint() if not isinstance(hint, int): msg = "Length hint must be an integer, not %r" raise TypeError(msg % type(hint)) if hint < 0: raise ValueError("%r is an infinite iterator" % (obj,)) return hint Cheers, Nick. -- Nick Coghlan | ncogh...@gmail.com | Brisbane, Australia _______________________________________________ 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/archive%40mail-archive.com