2013-07-22 120 views
1

我跟着這個傳遞函數作爲參數:傳遞功能參數與命名參數

Passing functions with arguments to another function in Python?

但是,我無法弄清楚如何通過功能與自身的參數作爲名稱參數

def retry(func, *args): 
    func(*args) 

def action(args): 
    do something 

retry(action, arg1, namedArg=arg2) 

在這裏,我得到一個異常:

TypeError: retry() got an unexpected keyword argument 'namedArg' 

通常情況下,我可以這樣做:

action(arg1, namedArg=arg2) 

請幫幫忙/

回答

3

*args和它的同胞**kwargs是一般用於額外的參數和關鍵字參數的名稱。當你通過namedArg=arg2時,你傳遞了一個關鍵詞的參數。

所以,試試這個來代替:

def retry(func, *args, **kwargs): 
    func(*args, **kwargs) 

def action(*args, **kwargs): 
    do something 

retry(action, arg1, namedArg=arg2) 

如果改用

def action(args, kwargs): 
    do something 

然後,你將用args作爲參數列表和kwargs最終作爲關鍵字參數的字典,所以在你的情況下

args = [arg1] 
kwargs = {'namedArg':arg2} 
+0

如何保證的論點目標函數的順序?讓m試試這個? thx用於快速repsonse – GJain

+2

列表中參數的順序與傳遞的順序相同。關鍵詞args是一本字典,所以沒有順序。 – sberry

+0

非常感謝..我很快就會接受答案。 – GJain

0

閱讀本,keyword arguments in python doc。由於錯誤明確指出,got an unexpected keyword argument 'namedArg'。因爲你只在* args中提供參數。

你會發現很多例子來理解關鍵字參數。

+0

我會讀這個。感謝您的快速回復 – GJain

0

你需要的是functools。

http://docs.python.org/2/library/functools.html#functools.partial

from functools import partial 

def action(arg): 
    do something 

def action2(arg=1): 
    do something 

def action3(arg1, arg2=2): 
    do something 

partial(action, arg1) 

partial(action, arg1, arg2=3) 
+0

一般而言,您會是對的,但retry()函數的重點似乎是在函數調用沒有成功時重複該函數調用。在你的情況下,可以將partial()的結果賦予該函數,並讓它像調用它一樣。但是,從你寫的內容來看,這並不清楚。 – glglgl