[Python-ideas] incremental hashing in __hash__

Neil Girdhar mistersheik at gmail.com
Fri Jan 6 04:02:23 EST 2017


On Fri, Jan 6, 2017 at 3:59 AM Paul Moore <p.f.moore at gmail.com> wrote:

> On 6 January 2017 at 07:26, Neil Girdhar <mistersheik at gmail.com> wrote:
> > On Fri, Jan 6, 2017 at 2:07 AM Stephen J. Turnbull
> > <turnbull.stephen.fw at u.tsukuba.ac.jp> wrote:
> >>
> >> Neil Girdhar writes:
> >>
> >>  > I don't understand this?  How is providing a default method in an
> >>  > abstract base class a pessimization?  If it happens to be slower
> >>  > than the code in the current methods, it can still be overridden.
> >>
> >> How often will people override until it's bitten them?  How many
> >> people will not even notice until they've lost business due to slow
> >> response?  If you don't have a default, that's much more obvious.
> >> Note that if there is a default, the collections are "large", and
> >> equality comparisons are "rare", this could be a substantial overhead.
> >
> >
> > I still don't understand what you're talking about here.  You're saying
> that
> > we shouldn't provide a __hash__ in case the default hash happens to be
> > slower than what the user wants and so by not providing it, we force the
> > user to write a fast one?  Doesn't that argument apply to all methods
> > provided by abcs?
>
> The point here is that ABCs should provide defaults for methods where
> there is an *obvious* default. It's not at all clear that there's an
> obvious default for __hash__.



>
> Unless I missed a revision of your proposal, what you suggested was:
>
>
Yeah, looks like you missed a revision.  There were two emails.  I
suggested adding ImmutableIterable and ImmutableSet, and so there is an
obvious implementation of __hash__ for both.


> > A better option is to add collections.abc.ImmutableIterable that derives
> from Iterable and provides __hash__.
>
> So what classes would derive from ImmutableIterable? Frozenset? A
> user-defined frozendict? There's no "obvious" default that would work
> for both those cases. And that's before we even get to the question of
> whether the default has the right performance characteristics, which
> is highly application-dependent.
>
> It's not clear to me if you expect ImmutableIterable to provide
> anything other than a default implementation of hash. If not, then how
> is making it an ABC any better than simply providing a helper function
> that people can use in their own __hash__ implementation? That would
> make it explicit what people are doing, and avoid any tendency towards
> people thinking they "should" inherit from ImmutableIterable and yet
> needing to override the only method it provides.
>
> Paul
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170106/977e10b5/attachment-0001.html>


More information about the Python-ideas mailing list