2010-11-17 37 views
9

¿Es correcto suponer que todas las funciones (integradas o definidas por el usuario) pertenecen a la misma clase, pero esa clase no parece estar vinculada a ninguna variable de forma predeterminada?python 3: cómo verificar si un objeto es una función?

¿Cómo puedo verificar que un objeto sea una función?

puedo hacer esto supongo:

def is_function(x): 
    def tmp() 
    pass 
    return type(x) is type(tmp) 

No parece ordenado, y ni siquiera estoy 100% seguro de que es perfectamente correcto.

+2

Hay también objetos con un método __call__ que se puede llamar como una función. – SiggyF

+1

Todas las clases se pueden llamar como una función. – PaulMcG

Respuesta

14

en python2:

callable(fn) 

en python3 :

isinstance(fn, collections.Callable) 

como Callable es una clase base abstracta, esto es equivalente a:

hasattr(fn, '__call__') 
+3

La función 'invocable' se eliminó por primera vez en Python 3.0 y luego se devolvió a Python 3.2, por lo que también puede usarla con Python 3 si usa una versión reciente del intérprete. Consulte http://docs.python.org/3/library/functions.html?highlight=callable#callable para obtener más información. –

1

Usted puede hacer:

def is_function(x): 
    import types 
    return isinstance(x, types.FunctionType) \ 
     or isinstance(x, types.BuiltinFunctionType) 
+0

pero, ¿esto también comprueba si es de la misma clase? –

+0

@Version, ¿a qué te refieres con 'si es de la misma clase'? –

+0

'is' en objetos tipo, yikes. Si debe usar comprobaciones de tipo explícitas, al menos use 'isinstance()', y preferiblemente solicite al módulo 'inspeccionar' que lo haga en su lugar. –

4

¿Cómo puedo comprobar que un objeto es una función?

No es éste el mismo que la comprobación de callables

hasattr(object, '__call__') 

y también en Python 2.x

callable(object) == True 
+1

también se aplica a las clases, pero +1 de todos modos tiene más parece en la lógica de pato escribiendo – kriss

-2
try: 
    magicVariable() 
except TypeError as e: 
    print('was no function') 
+3

-1, no debería tener que ejecutar la función para probarlo. –

+4

Mi código no es una * prueba *. Cuando tienes una variable, la única razón por la que verificarías si es una función es porque quieres usarla. Por lo tanto, en lugar de invertir tiempo en verificar eso de antemano, solo debe usarlo como una función y manejar la excepción. – poke

+1

lo he usado porque, en el caso general, creo que tienes razón, pero definitivamente hay casos en los que uno quiere saber si se trata de una función sin tener la intención de ejecutarla. Las metaclases y los decoradores de clase me vienen a la mente. – aaronasterling

Cuestiones relacionadas