2010-11-17 15 views
9

Sono corretto assumendo che tutte le funzioni (built-in o definite dall'utente) appartengano alla stessa classe, ma quella classe non sembra essere associata a nessuna variabile per impostazione predefinita?python 3: come verificare se un oggetto è una funzione?

Come posso verificare che un oggetto sia una funzione?

posso fare questo immagino:

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

Non sembra pulito, e sono sicuro che nemmeno al 100% è perfettamente corretto.

+2

Ci sono anche oggetti con un metodo __call__ che può essere chiamata come una funzione. – SiggyF

+1

Tutte le classi possono essere chiamate come una funzione. – PaulMcG

risposta

14

in python2:

callable(fn) 

in python3 :

isinstance(fn, collections.Callable) 

come Callable è una classe base astratta, questo equivale a:

hasattr(fn, '__call__') 
+3

La funzione 'callable' è stata prima rimossa in Python 3.0 e poi riportata in Python 3.2 - quindi è possibile utilizzarla anche con Python 3 se si utilizza una versione recente dell'interprete. Vedi http://docs.python.org/3/library/functions.html?highlight=callable#callable per ulteriori informazioni. –

1

Si può fare:

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

ma verifica anche se è della stessa classe? –

+0

@Version, cosa intendi con 'se è della stessa classe'? –

+0

'is' su tipo oggetti, yikes. Se devi usare typechecks espliciti, almeno usa 'isinstance()', e preferibilmente chiedi invece al modulo 'inspect' di farlo. –

4

Come si può verificare che un oggetto è una funzione?

Non è la stessa come il controllo per oggetti chiamabili

hasattr(object, '__call__') 

e anche in python 2.x

callable(object) == True 
+1

si applica anche alle classi, ma +1 comunque sembra più nella logica della digitazione anatra – kriss

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

-1, non è necessario eseguire la funzione per testarla. –

+4

Il mio codice non è inteso come * test *. Quando hai una variabile, l'unica ragione per cui dovresti controllare se è una funzione è perché vuoi usarla. Quindi, invece di investire tempo per controllarlo in anticipo, dovresti semplicemente usarlo come una funzione e gestire l'eccezione. – poke

+1

ho fatto +1 perché, nel caso generale, penso che tu abbia ragione, ma ci sono sicuramente dei casi in cui si vuole sapere se si ha a che fare con una funzione senza avere alcuna intenzione di eseguirla. Mi vengono in mente i metaclassi e i decoratori di classe. – aaronasterling

Problemi correlati