[Python-Dev] getting rid of default object.__hash__ (SF 660098)
Nick Coghlan
ncoghlan at iinet.net.au
Tue Dec 23 05:03:55 EST 2003
[Barry]
>>Would it be better if object.__hash__() raised a NotImplementedError?
[Guido]
> It can't -- it's type.__hash__(object).
If I understand Barry's suggestion correctly, he means to keep
object.__hash__, but have it raise a specific, meaningful error instead
of making a potentially incorrect assumption as it does now.
E.g. (not real code, since this would behave differently in Py 2.3.3)
>>> class Works(object): pass
>>> class Breaks(object):
... def __cmp__(): return 0 # All instances are created equal!
>>> work = Works()
>>> break = Breaks()
>>> hash(work)
45632543
>>> hash(break)
Traceback (most recent call last):
<Traceback info>
NotImplementedError: Must explicitly define __hash__ for non-default
comparisons
hash(work) is fine, since there is no __cmp__ or __eq__ override in
Works, and hence object.__hash__ never gets called.
hash(break) raises the exception because of the existence of the (rather
useless) __cmp__ function in the Breaks class.
Cheers,
Nick.
--
Nick Coghlan | Brisbane, Australia
Email: ncoghlan at email.com | Mobile: +61 409 573 268
More information about the Python-Dev
mailing list