2008-09-16 61 views
6

我有一個函數在Python上迭代從dir(obj)返回的屬性,我想檢查是否有任何內部包含的對象是函數,方法,內置函數等。通常情況下,您可以爲此使用callable(),但我不想包含類。到目前爲止我所得到的最好的結果是:如果對象是任何函數類型,是否有一種常用的方法來檢查Python?

isinstance(obj, (types.BuiltinFunctionType, types.FunctionType, types.MethodType)) 

有沒有更具前瞻性的方法來做這個檢查?

編輯:我之前說錯了:「通常你可以使用callable(),但我不想取消資格。」我其實想要取消資格的類。我想匹配只有函數,而不是類。

回答

13

的檢查模塊正是你想要的:

inspect.isroutine(obj) 

僅供參考,代碼:

def isroutine(object): 
    """Return true if the object is any kind of function or method.""" 
    return (isbuiltin(object) 
      or isfunction(object) 
      or ismethod(object) 
      or ismethoddescriptor(object)) 
2
if hasattr(obj, '__call__'): pass 

這也符合與Python的「鴨子類型」的理念更好,因爲你並不真正關心什麼是,只要你可以調用它。

值得注意的是,callable()正在從Python中刪除,並不在3.0中。

+1

值得關注的是,它只對新型類的工作。對於舊式課程,你會得到False。 – 2008-09-16 16:28:48

5

如果要排除類和其他隨機對象可能有__call__方法,只檢查函數和方法,在inspect module

inspect.isfunction(obj) 
inspect.isbuiltin(obj) 
inspect.ismethod(obj) 

這三個函數應該做你想做的事,未來方式。

+0

Upvoted,因爲您可以在用戶定義的類中定義__call__項,並且hasattr會高興地告訴您該類具有__call__屬性,即使它不是函數,您也可以選擇使用hasattr解決方案。 – 2008-09-16 17:28:28

+0

我不明白這比我原來的評論中的解決方案更好嗎?你仍然必須明確檢查所有三個。 – 2008-09-16 17:49:08

1

根據你所說的 '階級' 是什麼:

callable(obj) and not inspect.isclass(obj) 

或:

callable(obj) and not isinstance(obj, types.ClassType) 

例如,結果是 '字典' 不同:

>>> callable(dict) and not inspect.isclass(dict) 
False 
>>> callable(dict) and not isinstance(dict, types.ClassType) 
True 
相關問題