2010-11-17 4 views
9

Czy mam rację, zakładając, że wszystkie funkcje (wbudowane lub zdefiniowane przez użytkownika) należą do tej samej klasy, ale ta klasa domyślnie nie jest związana z żadną zmienną?python 3: jak sprawdzić, czy obiekt jest funkcją?

Jak mogę sprawdzić, czy obiekt jest funkcją?

mogę to zrobić Chyba:

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

Nie wydaje się czysty, a ja nie jestem jeszcze w 100% pewien, że to całkowicie poprawne.

+2

Istnieją również obiekty z metody __call__ które można nazwać jako funkcja. – SiggyF

+1

Wszystkie klasy można wywoływać jako funkcję. – PaulMcG

Odpowiedz

14

w python2:

callable(fn) 

w python3 :

isinstance(fn, collections.Callable) 

jak wywoływalnym jest abstrakcyjna klasa bazowa, jest to równoznaczne z:

hasattr(fn, '__call__') 
+3

Funkcja 'callable' została po raz pierwszy usunięta w Pythonie 3.0, a następnie przywrócona w Pythonie 3.2 - dzięki czemu możesz jej użyć w/Pythonie 3, jeśli używasz najnowszej wersji interpretera. Zobacz http://docs.python.org/3/library/functions.html?highlight=callable#callable, aby uzyskać więcej informacji. –

1

można zrobić:

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

, ale czy to również sprawdza, czy jest to ta sama klasa? –

+0

@Version, co masz na myśli przez "jeśli jest tej samej klasy"? –

+0

'jest' na obiektach typu, yikes. Jeśli musisz użyć jawnych sprawdzeń typu, użyj przynajmniej 'isinstance()', a najlepiej spytaj moduł 'inspect', aby to zrobił. –

4

Jak mogę sprawdzić, czy obiekt jest funkcją?

nie jest to samo jak sprawdzanie callables

hasattr(object, '__call__') 

a także w Pythonie 2.x

callable(object) == True 
+1

dotyczy to również klas, ale +1 i tak wydaje się być bardziej logiczny w kaczce, wpisując: – kriss

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

-1, nie powinieneś wykonywać tej funkcji, aby ją przetestować. –

+4

Mój kod nie jest rozumiany jako * test *. Gdy masz zmienną, jedynym powodem, dla którego chcesz sprawdzić, czy jest to funkcja, jest to, że chcesz jej użyć. Zamiast więc inwestować czas w sprawdzanie tego wcześniej, powinieneś po prostu użyć go jako funkcji i obsłużyć wyjątek. – poke

+1

i + 1 to, ponieważ w ogólnym przypadku, myślę, że masz rację, ale są na pewno przypadki, w których ktoś chce wiedzieć, czy ktoś ma do czynienia z funkcją bez jakiegokolwiek zamiaru jej wykonania. Pojawiają się metaklasy i dekoratorzy klas. – aaronasterling