URL: http://docs.python.org/lib/built-in-funcs.html

Python gurus are going to laugh at me for this one but I learnt it today; how to check if an object is callable. Before this I thought I was clever with this:


>>> def foo(): return "s"
>>> hasattr(foo, '__call__')
True
>>> hasattr(foo(), '__call__')
False

But there was an easier way. I discovered this by accident and looked it up in the documentation after. Use the builtin function called 'callable()':


>>> def foo(): return "s"
>>> callable(foo)
True
>>> callable(foo())
False

D'oh!

Comments

Post your own comment
James Gray

According to PEP 3000 the callable built-in function is going to be gone in Python 3.0. In the interest of staying compatible you may want to stick with the old way or call it and catch the exception as the previous comment mentioned. (PEP 3000 - http://www.python.org/peps/pep-3000.html)

Often it pays not to get fancy...

Anonymous

probably the best way (if you can afford to wait until the last possible moment) is to try making the call and catch the TypeError exception

Peter Bengtsson

I prefer not to use try and except statements. They look too wild and don't give any performance improvement.

Anonymous

Except for callables which might trigger nuclear weapons.

Eeswar Ravi

Good discovery. It helped you.

I tried callable(iter) and callable(candygram.link)

both returned true.....ya I was lazy to write a callable.

Anonymous

"the callable built-in function is going to be gone in Python 3.0"

in that case, hasattr(foo, '__call__') seems more logical (to a second hand reader) than catching the exception, in my opinion..

Me Me Me

Python 3.3 shell log:

>>> def Foo():
return Foo

>>> f = Foo()
>>> f
<function Foo at 0x01F45930>
>>> callable(Foo)
True
>>> callable(Foo())
True
>>> callable(f)
True

Peter Bengtsson

Is that not what you expect?

Your email will never ever be published.

Previous:
Ugly one-liner to debug an object in Zope March 31, 2005 Zope
Next:
Python Cookbook arrived April 5, 2005 Books
Related by category:
How I run standalone Python in 2025 January 14, 2025 Python
get in JavaScript is the same as property in Python February 13, 2025 Python
How to resolve a git conflict in poetry.lock February 7, 2020 Python
Best practice with retries with requests April 19, 2017 Python
Related by keyword:
get in JavaScript is the same as property in Python February 13, 2025 Python, JavaScript