[Python-3000] callable()

Nick Coghlan ncoghlan at gmail.com
Fri Jul 28 16:23:45 CEST 2006


Marcin 'Qrczak' Kowalczyk wrote:
> Stefan Behnel <behnel_ml at gkec.informatik.tu-darmstadt.de> writes:
> 
>> So, if hashable() returns True, it means that a) the designer didn't
>> care about switching it off or b) there are cases where it works, so
>> it makes sense to try calling it.
> 
> If the code can successfully work with either hashable or non-hashable
> objects, it can just always try to call it (and deal with potential
> failure), rather than test first and then check for failure anyway.

The use cases are where the check and the subsequent usage are in different 
parts of the code - by doing the check early, you can flag some errors near 
the point where they are introduced (i.e. the object passed in definitely 
doesn't support the needed protocol), rather than doing it later where the 
traceback will actually lead you on a wild goose chase.

This case is strongest for callable() - calling an object early generally 
won't be an option, especially if it is a callback that should only be called 
after a particular event has occurred. Note that in the case of a bug in the 
callback function itself, the traceback will start from inside the function, 
but if the callback isn't actually callable, you have to somehow figure out 
which code was responsible for registering the callback in the first place. 
Flagging that something that definitely isn't callable has been passed as a 
callback parameter at the time it is passed in, rather than when the callback 
is invoked, will make such errors far easier to resolve.

Use cases for a "may be hashable" pretest are much weaker (and typically 
hypothetical), but there are cases where it makes a certain amount of sense. 
For example, if you have a set-based fast path if all the objects being 
handled are hashable, and a list-based slow path if one or more aren't 
hashable, and the hashes themselves may be expensive to calculate (e.g. some 
of the objects may be large strings) then it may make sense to perform a 
precheck to ensure that all of the objects are at least *potentially* hashable 
before you try to put any of them into a set.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org


More information about the Python-3000 mailing list