2016-05-17 86 views
3

我已經得到形式的字符串列表:談到字符串列表到函數調用

['function1', 'function2'] 

我想執行它們的方法:

function1(myVar) 
function2(myVar) 

編程。

什麼是「正確」的方式?

+6

你必須使用字符串列表嗎?你可以用'[function1,function2]'函數列表嗎? – kennytm

+0

這似乎難以置信地不安全。我建議使用列表中的函數。 – erip

+2

'正確'的方式可能不是以字符串列表開始。 – khelwood

回答

1

如果這些你想要調用的函數在你可以通過訪問它們的模塊中getattr

import your_module 

method_names = ['function1', 'function2'] 

for name in method_names: 
    func = gettattr(your_module, name) 
    # invoke now 
    func() # Pass in your arguments if needed. 
+0

通過名稱引用一個函數是很常見的,在這裏我們想要引用一個還不存在的對象的方法,或者是一個包含多個相似對象的(綁定)方法。 'getattr(object,name)()'是很常見的,有或沒有先驗證檢查'name'是否指這種形式的創新的「安全」方法。模塊當然是一個對象。 – nigel222

2

locals()在此上下文中返回所有局部變量的dict,您的函數應該在其中。

for name in list: 
    locals()[name](myVar) 
+0

如果函數列表來自不可信的輸入,這很難維護並且可能是一個非常嚴重的安全問題。 –

+0

絕對。我不建議這樣做,但仍然是OP尋找的答案 –

+0

這不是「答案」,而是「可能的答案之一」 - 請參考我自己的答案以獲得更安全的解決方案。 –

3

如果你真的需要使用功能名稱(字符串),你最安全的賭注是保持允許函數名功能的映射,即:

allowed_functions = { 
    "function1": function1, 
    "function2": function2, 
    # etc 
    } 

然後查找該映射:

def applyfunc(funcname, *args, **kw): 
    func = allowed_func.get(funcname, None) 
    if func is None: 
     raise ValueError("func '%s' is not allowed" % funcname) 
    return func(*args, **kw) 

這是非常類似於使用locals()方式安全的(且更容易維持)尼爾斯·沃納的解決方案。

否則,請記住,Python函數是對象(如你從上面的例子注意到),所以如果你想要的是功能列表,那麼它的簡單,因爲它可以得到:

funcs = [function1, function2) 
for func in funcs: 
    print func(myvar) 
+0

我會爲允許的功能使用特殊的前綴。我的意思是輸入'f1'要調用的函數是'myfunc_f1'。同樣安全並且不需要查找表。 – VPfB

+0

@VPfB查找表很清楚哪些函數可以這樣調用。從經驗來看,它使維護更容易。 –