I've written a class whose .__hash__() implementation takes a long time to execute. I've been thinking to cache its hash, and store it in a variable like ._hash so the .__hash__() method would simply return ._hash. (Which will be computed either at the end of the .__init__() or the first time .__hash__() is called.)
My reasoning was: "This object is immutable -> Its hash will never change -> I can cache the hash."
But now that got me thinking: You can say the same thing about any hashable object. (With the exception of objects whose hash is their id.)
So is there ever a reason not to cache an object's hash, except for small objects whose hash computation is very fast?
The usual reason is that most objects in Python are mutable, so if the hash depends on the properties, it changes as soon as you change a property. If your class really is an immutable and (all the properties which go into the hash are immutable, too!), then you can cache the hash.
Is there any reason *not* to cache an object's hash?