Any built-in ishashable method ?
Terry Reedy
tjreedy at udel.edu
Fri Jan 18 06:25:51 EST 2013
On 1/18/2013 5:36 AM, Jean-Michel Pichavant wrote:
> Hello people,
>
> Is there any built-in way to know if an object is a valid dictionary key ?
For the instances of a class to be properly useable as set members or
dict keys, __eq__ must return bool, __hash__ must return int, the __eq__
and __hash__ methods must define equivalence relations on the instances
of the class, and the hash relation should be a coarsening of the eq
relation. By default, for objects()s, equality is identity and hash is
id, so these condition are met.
If the instances of a class can compare equal to instances of another
class then apply the , then apply the above to the union of the classes
if they are used together in one set or dict.
An example of when the union condition was broken. We had 0.0 == 0 and
== decimal(0) but 0.0 != decimal(0). The breaking of transitivity of ==
has nasty effects when mixing floats, ints, and decimals in one
set/class. (This is fixed now.) For one thing, set((0, 0.0, decimal(0)))
had one member while set((0.0, 0, decimal(0))) had two ;-)
> I was trying to know if any custom class can be used as a dict key.
Yes, unless the __eq__ and __hash__ methods have been over-written in
the inheritance chain in a way that violates the conditions, or if the
class instances are mixed with other class instances that joint violate
the conditions.
> Yet I'm a little bit concerned, because last time I used invalid
> objects as keys, I got a bug that was really difficult to spot.
Yeh, see the example above ;-).
--
Terry Jan Reedy
More information about the Python-list
mailing list