2010-11-17 174 views
9

我是否正確假設所有函數(內置或用戶定義的)屬於同一個類,但該類默認情況下似乎沒有綁定到任何變量?python 3:如何檢查一個對象是否是一個函數?

如何檢查對象是否是函數?

我能做到這一點,我想:

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

這似乎並不整齊,而且我甚至100%肯定它是完全正確的。

+2

另外還有與__call__方法,該方法可以被稱爲一個函數對象。 – SiggyF 2010-11-17 07:30:10

+1

所有類都可以作爲函數調用。 – PaulMcG 2010-11-17 09:49:44

回答

14

在python2:

callable(fn) 

在python3 :

isinstance(fn, collections.Callable) 

作爲可贖回是一個抽象基類,這相當於:

hasattr(fn, '__call__') 
+3

'可調用函數'首先在Python 3.0中被移除,然後被帶回到Python 3.2中 - 所以如果使用最新版本的解釋器,你也可以使用它。有關更多信息,請參閱http://docs.python.org/3/library/functions.html?highlight=callable#callable。 – 2013-11-18 14:46:42

1

你可以這樣做:

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

但這是否也檢查它是否屬於同一類? – 2010-11-17 07:29:00

+0

@Version,如果它屬於同一類,那你是什麼意思? – 2010-11-17 07:31:08

+0

對於類型的對象,是''是''。如果你必須使用明確的類型檢查,至少應該使用'isinstance()',並且最好讓'inspect'模塊去做。 – 2010-11-17 08:50:23

4

我如何檢查的對象是一個功能?

這難道不是一樣可調用

檢查
hasattr(object, '__call__') 

,並在Python 2.x的

callable(object) == True 
+1

它也適用於類,但+1無論如何,它似乎更多的在鴨打字 – kriss 2010-11-17 07:28:55

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

-1的邏輯,你不應該執行函數來測試它。 – 2010-11-17 08:24:09

+4

我的代碼不是作爲*測試*。當你有一個變量時,你檢查它是否是函數的唯一原因是你想使用它。因此,不要花時間檢查,而應該將其用作函數並處理異常。 – poke 2010-11-17 08:26:12

+1

我爲它+1了,因爲在一般情況下,我認爲你是對的,但肯定會有人想知道是否有人正在處理一個函數而沒有執行它的意圖。元類和類裝飾器浮現在腦海。 – aaronasterling 2010-11-17 08:31:16

相關問題