¿Hay una forma común de comprobar en Python si un objeto es algún tipo de función?

Tengo una función en Python que está iterando sobre los atributos devueltos por dir (obj), y quiero verificar si alguno de los objetos que contiene es una función, un método, una función incorporada, etc. Normalmente puede usar callable () para esto, pero no quiero incluir clases. Lo mejor que he encontrado hasta ahora es:

isinstance(obj, (types.BuiltinFunctionType, types.FunctionType, types.MethodType)) 

¿Hay alguna forma más segura de hacer este chequeo?

Edit: Me equivoqué antes cuando dije: “Normalmente, puedes usar callable () para esto, pero no quiero descalificar las clases”. Realmente quiero descalificar las clases. Quiero unir solo funciones, no clases.

El módulo de inspección tiene exactamente lo que quieres:

 inspect.isroutine( obj ) 

Para su información, el código es:

 def isroutine(object): """Return true if the object is any kind of function or method.""" return (isbuiltin(object) or isfunction(object) or ismethod(object) or ismethoddescriptor(object)) 

Si desea excluir clases y otros objetos aleatorios que pueden tener un método __call__ , y solo verificar funciones y métodos, estas tres funciones en el módulo de inspect

 inspect.isfunction(obj) inspect.isbuiltin(obj) inspect.ismethod(obj) 

Debería hacer lo que quiera de una manera a prueba de futuro.

 if hasattr(obj, '__call__'): pass 

Esto también encaja mejor con la filosofía “tipografía de pato” de Python, porque realmente no te importa lo que sea, siempre que puedas llamarlo.

Vale la pena señalar que callable() se está eliminando de Python y no está presente en 3.0.

Dependiendo de lo que quieras decir con ‘clase’:

 callable( obj ) and not inspect.isclass( obj ) 

o:

 callable( obj ) and not isinstance( obj, types.ClassType ) 

Por ejemplo, los resultados son diferentes para ‘dict’:

 >>> callable( dict ) and not inspect.isclass( dict ) False >>> callable( dict ) and not isinstance( dict, types.ClassType ) True