[Python-3000] callable()

Michael Chermside mcherm at mcherm.com
Mon Jul 24 22:42:42 CEST 2006


I wrote:
> [1] I subtlely switched language from "side effect free" to "idempotent"
>      here because caching *IS* acceptable in __hash__ mehtods. If you're
>      not paying close attention I probably got away with it.

Andrew Koenig responds:
> I picked it up before seeing the footnote :-)

Yeah... I have to keep in mind that the readers of python-dev and
python-3000 are a lot sharper than most folks I correspond with.

Andrew again:
> I can think of two troublesome cases; there may be others I haven't thought
> of.
>
> 1) An object x with a component y that might be hashable.  x is hashable
> apart from x.y, but hashing x for the first time has side effects, so the
> value is cached.  The hash of x depends partly on the hash of x.y.
     [...]
> 2) An object for which computing the hash for the first time requires human
> action.

In both cases, __hash__ is not idempotent, and is thus an abomination. Case
1 is a perverse programmer -- well known to be capable of abominations.
Case 2 sounds like a made-up example... can you think of anything real
which behaves this way? (For instance: the file type doesn't even though
it might, and I presume this is intentional.)

-- Michael Chermside



More information about the Python-3000 mailing list