2015-12-14 27 views
3

對不起,如果這之前已被問過,但我找不到要搜索的詞,這將給我我要找的答案。我可以有條件地更改我打電話的功能嗎?

我正在寫一個腳本,其中包含一個輔助函數,該函數又可以調用幾個函數中的一個,它們都採用相同的參數。在這個輔助功能,我最終的這個字符串:

if funcName="func1": 
    func1(p1, p2, p3) 
elif funcName="func2": 
    func2(p1, p2, p3) 
elif funcName="func3": 
    func3(p1, p2, p3) 
... 

我知道我可以使用其他的輔助功能也將採取了funcName字符串,並將其分配給相應的功能,但有沒有更好的辦法去做吧?我的大腦想要做的是這樣的:

funcName(p1, p2, p3) 

這樣我就可以調用一個任意的函數名稱,如果我想。有這樣的可能嗎?

回答

7

是的,你可以通過使用dict名稱映射到功能:

funcs = dict(
    func1=func1, 
    func2=func2, 
    func3=func3 
) 

funcs[funcName](p1, p2, p3) 
+0

美麗。正是我想要的東西存在。謝謝! – lucas755

1

如果你把函數對象內像這樣:

var funcs = 
{ 
    f1: function() {}, 
    f2: function() {}, 
    f3: function() {} 
} 

比如,你可以做funcs['f1']()

+1

什麼,什麼。這是python。抱歉! – Piwwoli

+1

答案在原理上是正確的,但OP是詢問Python而不是JavaScript。 –

1

您可以將localsglobals字典中稱他們爲:

locals()[funcName](p1, p2, p3) 

例子:

>>> a = lambda x: x+1 
>>> locals()['a'](2) 
3 

正如評論下面你可以檢查它們是否預期之內:

if funcName in ["func1", "func2", "func3"]: 
    locals()[funcName](p1, p2, p3) 
+1

請注意,如果'funcName'來自惡意用戶,那麼您可以讓他訪問範圍內的所有*函數。 – GingerPlusPlus

+0

你可以檢查他們是否在封閉列表中... – Netwave

相關問題