2012-08-02 164 views
9

我正在使用getattr根據變量調用不同的函數。Python使用getattr調用具有可變參數的函數

Im做這樣的事情:

getattr(foo, bar)() 

這樣的作品,像調用foo.bar)功能(

我的問題是,我有「酒吧」功能,我想用不同的稱呼它參數。例如:

def f1() : 
    pass 

def f2(param1) : 
    pass 

def f3(param1,param2) : 
    pass 

所以「酒吧」可能是F1,F2或F3

我嘗試這樣做: assumming是params爲包含所需的「酒吧」功能的所有參數列表

getattr(foo, bar) (for p in params :) 

我看一個「乾淨」的解決方案,沒有必要看是否存在params變量

回答

16

你可以嘗試喜歡的東西長度:

getattr(foo, bar)(*params) 

如果params是一個列表或元組,則此方法有效。從params元素將依次被解壓:

params=(1, 2) 
foo(*params) 

等同於:

params=(1, 2) 
foo(params[0], params[1]) 

如果有關鍵字參數,你可以做到這一點。

getattr(foo, bar)(*params, **keyword_params) 

其中keyword_params是一本字典。

此外,這個答案是獨立於getattr。它將適用於任何功能/方法。

+2

我知道OP沒有特別要求,但我也會加上'** kwargs',這樣他就不會在以後嘗試使用關鍵字參數時很難追蹤錯誤。 – 2012-08-02 15:56:05

+0

@ sr2222 - 已添加。 – mgilson 2012-08-02 16:00:42

相關問題