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

StackOverflow https://stackoverflow.com/questions/74092

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo una función en Python que itera sobre los atributos devueltos por dir(obj), y quiero verificar si alguno de los objetos contenidos en ella es una función, método, función incorporada, etc.Normalmente podrías usar callable() para esto, pero no quiero incluir clases.Lo mejor que se me ha ocurrido hasta ahora es:

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

¿Existe una forma más preparada para el futuro de realizar esta verificación?

Editar: Me equivoqué antes cuando dije:"Normalmente podría usar Callable () para esto, pero no quiero descalificar las clases". Yo realmente hacer Quiero descalificar clases.quiero igualar solo funciones, no clases.

¿Fue útil?

Solución

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

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))

Otros consejos

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

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

debe hacer lo que quiera de forma preparada para el futuro.

if hasattr(obj, '__call__'): pass

Esto también encaja mejor con la filosofía de "tipificación de pato" de Python, porque realmente no te importa qué lo es, siempre y cuando 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top