The python documentation mentions that if you override __eq__
and the object is immutable, you should also override __hash__
in order for the class to be properly hashable.
In practice, when I do this I often end up with code like
class MyClass(object):
def __init__(self, a, b):
self.a = a
self.b = b
def __eq__(self, other):
if type(other) is type(self):
return (self.a == other.a) and (self.b == other.b)
else:
return False
def __hash__(self):
return hash((self.a, self.b))
This is somewhat repetitive, and there is a clear risk of forgetting to update one when the other is updated.
Is there a recommended way of implementing these methods together?
Summary. Implement the Python __eq__ method to define the equality logic for comparing two objects using the equal operator ( == )
Introduction to the Python hash function The hash() function accepts an object and returns the hash value as an integer. When you pass an object to the hash() function, Python will execute the __hash__ special method of the object.
If you want to make your classes hashable, you must follow two rules outlined in the Python Glossary for the entry for "hashable": An object is hashable if [1] it has a hash value which never changes during its lifetime (it needs a __hash__() method), and can be compared to other objects (it needs an __eq__() method).
Answering my own question. It seems one way of performing this is to define an auxillary __members
function and to use that in defining __hash__
and __eq__
. This way, there is no duplication:
class MyClass(object):
def __init__(self, a, b):
self.a = a
self.b = b
def __members(self):
return (self.a, self.b)
def __eq__(self, other):
if type(other) is type(self):
return self.__members() == other.__members()
else:
return False
def __hash__(self):
return hash(self.__members())
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With