[Python-Dev] Documentation Error for hash (original) (raw)
Michael Foord fuzzyman at voidspace.org.uk
Fri Aug 29 13:22:00 CEST 2008
- Previous message: [Python-Dev] Documentation Error for __hash__
- Next message: [Python-Dev] Documentation Error for __hash__
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
M.-A. Lemburg wrote:
On 2008-08-28 21:31, Michael Foord wrote:
Hello all,
The documentation for hash seems to be outdated. I'm happy to submit a patch, so long as I am not misunderstanding something. http://docs.python.org/dev/reference/datamodel.html#object.hash The documentation states: If a class does not define a cmp() or eq() method it should not define a hash() operation either; if it defines cmp() or eq() but not hash(), its instances will not be usable as dictionary keys. If a class defines mutable objects and implements a cmp() or eq() method, it should not implement hash(), since the dictionary implementation requires that a key's hash value is immutable (if the object's hash value changes, it will be in the wrong hash bucket).
This may have been true for old style classes, but as new style classes inherit a default hash from object - mutable objects will be usable as dictionary keys (hashed on identity) unless they implement a hash method that raises a type error. Being hashable is a different from being usable as dictionary key. Dictionaries perform the lookup based on the hash value, but will then have to check for hash collisions based on an equal comparison. If an object does not define an equal comparison, then it is not usable as dictionary key. Shouldn't the advice be that classes that implement comparison methods should always implement hash (wasn't this nearly enforced?), It's probably a good idea to implement hash for objects that implement comparisons, but it won't always work and it is certainly not needed, unless you intend to use them as dictionary keys.
So you're suggesting that we document something like.
Classes that represent mutable values and define equality methods are free to define hash so long as you don't mind them being used incorrectly if treated as dictionary keys...
Technically true, but not very helpful in my opinion... :-)
Michael
and that mutable objects should raise a TypeError in hash.
That's a good idea, even though it's not needed either ;-)
-- http://www.ironpythoninaction.com/ http://www.voidspace.org.uk/ http://www.trypython.org/ http://www.ironpython.info/ http://www.resolverhacks.net/ http://www.theotherdelia.co.uk/
- Previous message: [Python-Dev] Documentation Error for __hash__
- Next message: [Python-Dev] Documentation Error for __hash__
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]