2014-05-25 24 views
4

我正在處理一個包含多個模塊的項目。簡化問題,有一些變量x。有時它可能是int或float或list。但它可能是一個lambda函數,應該以不同的方式處理。如何檢查變量x是lambda?如何檢查該變量是拉姆達函數

例如

>>> x = 3 
>>> type(x) 
<type 'int'> 
>>> type(x) is int 
True 
>>> x = 3.4 
>>> type(x) 
<type 'float'> 
>>> type(x) is float 
True 
>>> x = lambda d:d*d 
>>> type(x) 
<type 'function'> 
>>> type(x) is lambda 
    File "<stdin>", line 1 
    type(x) is lambda 
        ^
SyntaxError: invalid syntax 
>>> type(x) is function 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'function' is not defined 
>>> 

回答

13

您需要使用types.LambdaTypetypes.FunctionType以確保該對象是這樣

x = lambda d:d*d 
import types 
print type(x) is types.LambdaType 
# True 
print isinstance(x, types.LambdaType) 
# True 

一個函數對象,然後你需要檢查名稱以及對請確保我們正在處理lambda函數,如下所示:

x = lambda x: None 
def y(): pass 
print y.__name__ 
# y 
print x.__name__ 
# <lambda> 

所以,我們放在一起這兩種檢查這樣

def is_lambda_function(obj): 
    return isinstance(obj, types.LambdaType) and obj.__name__ == "<lambda>" 

由於@Blckknght建議,如果要檢查的對象僅僅是一個可調用的對象,那麼你可以使用內置的callable功能。

+2

'isinstance(x,types.LambdaType)'看起來更習慣。 – bereal

+3

值得注意的是'types.LambdaType'是'types.FunctionType'的別名。沒有(簡單或可靠的)方法來區分lambda函數和用'def'創建的函數。 – Blckknght

+1

@Blckknght這就是爲什麼我們需要檢查'__name__' :-) – thefourtheye