[Python-Dev] PEP 0424: A method for exposing a length hint (original) (raw)
Alex Gaynor alex.gaynor at gmail.com
Sun Jul 15 07:20:03 CEST 2012
- Previous message: [Python-Dev] PEP 0424: A method for exposing a length hint
- Next message: [Python-Dev] PEP 0424: A method for exposing a length hint
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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 tobuiltins
or some other module which >> calls_lengthhint_
, likebuiltins.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.lengthhint" function with the following semantics: def lengthhint(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: gethint = obj.lengthhint except AttributeError: return 0 hint = gethint() 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>
- Previous message: [Python-Dev] PEP 0424: A method for exposing a length hint
- Next message: [Python-Dev] PEP 0424: A method for exposing a length hint
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]