[Python-Dev] PEP 0424: A method for exposing a length hint

Alex Gaynor alex.gaynor at gmail.com
Sun Jul 15 07:20:03 CEST 2012


On Sat, Jul 14, 2012 at 10:16 PM, Nick Coghlan <ncoghlan at gmail.com> wrote:

> On Sun, Jul 15, 2012 at 9:18 AM, Benjamin Peterson <benjamin at python.org>
> wrote:
> >> Open questions
> >> ==============
> >>
> >> There are two open questions for this PEP:
> >>
> >> * Should ``list`` expose a kwarg in it's constructor for supplying a
> length
> >>   hint.
> >> * Should a function be added either to ``builtins`` or some other
> module which
> >>   calls ``__length_hint__``, like ``builtins.len`` calls ``__len__``.
> >
> > Let's try to keep this as limited as possible for a public API.
>
> Length hints are very useful for *any* container implementation,
> whether those containers are in the standard library or not. Just as
> we exposed operator.index when __index__ was added, we should expose
> an "operator.length_hint" function with the following semantics:
>
>     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. The
>         result will be an integer >= 0.
>         """
>         try:
>             return len(obj)
>         except TypeError:
>             try:
>                 get_hint = obj.__length_hint__
>             except AttributeError:
>                 return 0
>             hint = get_hint()
>             if not isinstance(hint, int):
>                 raise TypeError("Length hint must be an integer, not
> %r" % type(hint))
>             if hint < 0:
>                 raise ValueError("Length hint (%r) must be >= 0" % hint)
>             return hint
>
> There's no reason to make pure Python container implementations
> reimplement all that for themselves.
>
> Cheers,
> Nick.
>
> --
> Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
>

Sounds reasonable to me, the only issue with your psuedocode (err... I mean
Python ;)), is that there's no way for the __lenght_hint__ to specify that
that particular instance can't have a length hint computed.  e.g. imagine
some sort of lazy stream that cached itself, and only wanted to offer a
length hint if it had already been evaluated.  Without an exception to
raise, it has to return whatever the magic value for length_hint is (in
your impl it appears to be 0, the current _PyObject_LengthHint method in
CPython has a required `default` parameter).  The PEP proposes using
TypeError for that.

Anyways that code looks good, do you want to add it to the PEP?

Alex

-- 
"I disapprove of what you say, but I will defend to the death your right to
say it." -- Evelyn Beatrice Hall (summarizing Voltaire)
"The people's good is the highest law." -- Cicero
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20120714/37f52bd4/attachment.html>


More information about the Python-Dev mailing list