2013-01-18 43 views
0

對不起,如果我沒有清楚解釋我自己。 我想創建一個包裝,以不同數量的輸入調用預定義的函數。當然,我可以爲每個函數創建一個單獨的包裝器,但是我想知道是否有辦法爲所有情況創建一個通用包裝器。將不確定數量的輸入傳遞給一個功能的子功能

應該調用的函數被命名爲「fun1」和「fun2」,其輸入數量不同。我需要創建一個包裝'fun_wrap(func_name,不確定數量的輸入)',它只需要調用函數名稱及其相關的輸入量。

還有一件事,我需要通過添加'_in'來改變輸入名稱,並首先將它們設置爲全局變量。以下是我的破解代碼。感謝您的任何建議!

def fun1(a,b): 
    return a+b 

def fun2(a,b,c): 
    return a*b/c 

def set_globals(**kwargs): 
    for argname in kwargs: 
     globals()['%s_in' % argname] = kwargs[argname] 

def fun_wrap(func_name, uncertain amount of inputs): 
    ffunc_name(set_globals(uncertain amount of inputs)) 

這樣一來,如果我能與像參數調用final_fun:

fun_wrap(fun1,a,b) 
fun_wrap(fun2,a,b) 
UPDATE

我試圖用* ARG,但失敗了......

def fun1(a,b): 
    return a+b 

def fun2(a,b,c): 
    return a*b/c 

def set_globals(**kwargs): 
    for argname in kwargs: 
     globals()['%s_in' % argname] = kwargs[argname] 

def fun_wrap(func_name, *arg): 
    func_name(set_globals(*arg)) 

fun_wrap(fun2,a=1,b=2,c=3) 

了錯誤:

Traceback (most recent call last): 
    File "D:\Dropbox\AppPest\rice\try.py", line 19, in <module> 
    fun_wrap(fun2,a=1,b=2,c=3) 
TypeError: fun_wrap() got an unexpected keyword argument 'a' 
+0

這段代碼沒有意義 - 爲什麼要設置這些全局變量? –

+0

「我需要通過添加'_in'來改變輸入名稱,並首先將它們設置爲全局變量。」 - 如果可以的話,最好現在回去改變'fun1'和'fun2'。 –

+0

如果你想用'fun_wrap(fun1,a,b)'''這樣的位置參數來調用你的包裝器,你正在使用'** kwargs'來處理關鍵字參數,試着用'* args'來代替。也可以使用第一個參數來接收您要調用的函數。 –

回答

1
def fun1(a,b): 
    return a + b 

def fun2(a,b,c): 
    return a * b/c 

def set_globals(**kwargs): 
    for argname in kwargs: 
     globals()['%s_in' % argname] = kwargs[argname] 

def fun_wrap(func, **kwargs): 
    set_globals(**kwargs)  # made the call to set_globals before calling your function 
    return func(**kwargs)  # return the value returned by the functions called 
+0

哦..我現在明白了。非常感謝! –