From python-list Wed Dec 29 16:56:41 2004 From: Stian =?iso-8859-1?Q?S=F8iland?= Date: Wed, 29 Dec 2004 16:56:41 +0000 To: python-list Subject: Re: objects as mutable dictionary keys Message-Id: <20041229165641.GD32339 () itea ! ntnu ! no> X-MARC-Message: https://marc.info/?l=python-list&m=110433947931184 On 2004-12-29 14:04:19, Nick Coghlan wrote: > This *is* a bug (since Guido called it such), but one not yet fixed as the > obvious solution (removing object.__hash__) causes problems for Jython, and > a non-obvious solution has not been identified. class object: def __hash__(self): # Need to check if our instance has defined some other # comparison functions without overloading __hash__ for f in "__cmp__ __eq__".split(): if not hasattr(self, f): continue # It has the function, but is it the same as in # object? f1 = getattr(self, f) f2 = getattr(object, f) if f1.im_func != f2.im_func: raise TypeError, "unhashable instance" return id(self) (..) Of course this won't work, as self.__cmp__ and it's like are so-called method-wrapper objects, and I can't immediately see a way to retrieve the original function behind this. Also, it might be possible that someone does something like this: class A(object): def __init__(self, use_id=True): self.use_id = use_id def __eq__(self, other): if self.use_id: return super(A, self).__eq__(other) else: return something_else def __hash__(self, other): if self.use_id: return super(A, self).__hash__(other) else: return something_else This will break the object.__hash__ shown above.. What about checking if __hash__ has been overridden as well, and if so, always return id()? -- Stian Søiland Work toward win-win situation. Win-lose Trondheim, Norway is where you win and the other lose. http://soiland.no/ Lose-lose and lose-win are left as an exercise to the reader. [Limoncelli/Hogan] Og dette er en ekstra linje -- http://mail.python.org/mailman/listinfo/python-list