2016-08-16 75 views
0

我有一個函數,需要3個關鍵字參數。它具有x和y的默認值,我想用map來調用z的不同值。當我運行下面我收到以下錯誤代碼:python部分與關鍵字參數

foo() got multiple values for keyword argument 'x'

def foo(x =1, y = 2, z = 3): 
    print 'x:%d, y:%d, z:%d'%(x, y, z) 


if __name__ == '__main__': 
    f1 = functools.partial(foo, x= 0, y = -6) 
    zz = range(10) 
    res = map(f1, zz) 

有沒有辦法解決這個問題的一個Python化的方式?

+0

當發佈有關拋出錯誤的代碼的問題時,請包含Traceback。 – wwii

+0

您是否會爲參數的不同組合創建部分,而不是您在示例中顯示的部分?您是否正在尋找一種通用的解決方案,您不必在部分調用簽名中指定* missing * arguments的名稱? – wwii

回答

2

map(f1, zz)試圖調用函數f1每個元素在zz,但它不知道與參數做到這一點。 partial重新定義foox=0map將嘗試重新分配x,因爲它使用位置參數。

爲了解決這個問題,你可以使用一個簡單的列表理解爲@mic4ael's答案,或者定義map內的λ:

res = map(lambda z: f1(z=z), zz) 

另一種解決方案是改變函數的簽名的參數的順序:

def foo(z=3, x=1, y=2): 
1

當試圖在內部調用res = map(f1, zz)時,它實際上看起來像[f1(i) for i in range(10)。正如你所看到的,你只需要一個位置參數就可以調用f1函數(在這種情況下爲f1(x=i))。一種可能的解決辦法是做這樣的事情

res = [f1(z=i) for i in range(10)]