2011-03-22 28 views
7

我需要做的是循環大量不同的文件並(嘗試)從文件中獲取元數據。在Python中通過變量名執行函數

我可以做一個大的if ... elif ...並測試每個擴展,但我認爲將擴展存儲在變量中會更容易,檢查是否存在具有該名稱的函數,並執行它。

這是我目前的解決方案,從另一個計算器線程採取:

try: 
    getattr(modulename, funcname)(arg) 
except AttributeError: 
    print 'function not found "%s" (%s)' % (funcname, arg) 

沒有與此問題: 如果底層函數產生一個AttributeError,這個被註冊爲「功能未找到」錯誤。 我可以加試...除了塊的所有功能,但不會特別漂亮要麼...

我正在尋找的是更多的類似:

if function_exists(fun): 
    execute_function(fun, arg) 

是否有直接的方式做到這一點?

感謝:-)

回答

22

你可以這樣做:

func = getattr(modulename, funcname, None): 
if func: 
    func(arg) 

或許更好:

try: 
    func = getattr(modulename, funcname) 
except AttributeError: 
    print 'function not found "%s" (%s)' % (funcname, arg) 
else: 
    func(arg) 
+1

我包'FUNC(ARG)':

要使用這個變量裏面'和catch類型錯誤的情況下,該模塊有一個屬性'func'不是調用。 – geoffspear 2011-03-22 12:37:42

+0

@Wooble:不錯的建議或者他也可以這樣做:'if func and callable(func):' – mouad 2011-03-22 12:40:15

+0

@Carpetsmoker:很高興幫助:) – mouad 2011-03-22 12:59:02

3

gettattr function有一個默認值返回,如果屬性不存在,所以你可以使用一個可選的第三個參數:

fun = getattr(modulename, funcname, None) 

if fun is None: 
    print 'function not found "%s" (%s)' % (funcname, arg) 
else 
    fun(arg) 
0

就像@mouad所說的,callable(function)可以調用一個函數。

你可以用它來使用這個變量裏面調用一個函數:

callable(SAVE()) 

這將調用被指定爲ARG的功能。在`嘗試

Save = callable(SAVE())