我已經得到形式的字符串列表:談到字符串列表到函數調用
['function1', 'function2']
我想執行它們的方法:
function1(myVar)
function2(myVar)
編程。
什麼是「正確」的方式?
我已經得到形式的字符串列表:談到字符串列表到函數調用
['function1', 'function2']
我想執行它們的方法:
function1(myVar)
function2(myVar)
編程。
什麼是「正確」的方式?
如果這些你想要調用的函數在你可以通過訪問它們的模塊中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.
通過名稱引用一個函數是很常見的,在這裏我們想要引用一個還不存在的對象的方法,或者是一個包含多個相似對象的(綁定)方法。 'getattr(object,name)()'是很常見的,有或沒有先驗證檢查'name'是否指這種形式的創新的「安全」方法。模塊當然是一個對象。 – nigel222
locals()
在此上下文中返回所有局部變量的dict
,您的函數應該在其中。
for name in list:
locals()[name](myVar)
如果函數列表來自不可信的輸入,這很難維護並且可能是一個非常嚴重的安全問題。 –
絕對。我不建議這樣做,但仍然是OP尋找的答案 –
這不是「答案」,而是「可能的答案之一」 - 請參考我自己的答案以獲得更安全的解決方案。 –
如果你真的需要使用功能名稱(字符串),你最安全的賭注是保持允許函數名功能的映射,即:
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)
我會爲允許的功能使用特殊的前綴。我的意思是輸入'f1'要調用的函數是'myfunc_f1'。同樣安全並且不需要查找表。 – VPfB
@VPfB查找表很清楚哪些函數可以這樣調用。從經驗來看,它使維護更容易。 –
你必須使用字符串列表嗎?你可以用'[function1,function2]'函數列表嗎? – kennytm
這似乎難以置信地不安全。我建議使用列表中的函數。 – erip
'正確'的方式可能不是以字符串列表開始。 – khelwood