I have a class with a field named arglist whose value is a list. I would like the order maintained to respect the callers provided order; however, I’d like equality to be independent of order.
I have implemented the __eq__ method as follows:
def __eq__(self, that):
return type(self) is type(that) and
set(self.arglist) == set(that.arglist)
How should I now implement the __hash__ method? When I try to the following, I get a runtime error.
def __hash__(self):
return hash(set(self.arglist))
The error I get is
File "/Users/jnewton/Repos/python-rte/genus/src/s_member.py", line 55, in __hash__
return hash(set(self.arglist))
TypeError: unhashable type: 'set'
Maybe what I’m trying to do doesn’t really make sense? Do I need to give up on the idea of order-independent equality?
Advertisement
Answer
The hash() method in python only works with immutable data type but set is a mutable data type, hence it is throwing an error. A frozenset or tuple which are immutable could be used instead.