How safe is a set of floats?
Klaas
mike.klaas at gmail.com
Tue May 8 17:42:58 EDT 2007
On May 4, 10:15 am, Paul McGuire <p... at austin.rr.com> wrote:
> Just to beat this into the ground, "test for equality" appears to be
> implemented as "test for equality of hashes". So if you want to
> implement a class for the purposes of set membership, you must
> implement a suitable __hash__ method. It is not sufficient to
> implement __cmp__ or __eq__, which I assumed "test for equality" would
> make use of. Not having a __hash__ method in my original class caused
> my initial confusion.
overriding __hash__ (even to raise NotImplementedError) is always wise
if you have override __eq__. And of course __hash__ is necessary for
using hashtable-based structures (how else could it determine whether
objects are equal? compare against every existing element?)
Finally, two objects which return the same __hash__ but return False
for __eq__ are, of course, unequal. sets/dicts do not simply "test
for equality of hashes"
> So would you suggest that any class implemented in a general-purpose
> class library should implement __hash__, since one cannot anticipate
> when a user might want to insert class instances into a set? (It
> certainly is not on my current checklist of methods to add to well-
> behaved classes.)
a class should be only inserted into a set if it is immutable, and
thus designed to such. User's might also execute 'del x.attr', so
perhaps you should start each method with a series of hasattr()
checks...
-Mike
More information about the Python-list
mailing list