2015-06-20 129 views
12

我有一個函數:可選參數

cost(X, model, reg = 1e-3, sparse) 

,我需要這個函數傳遞到另一個形式下:

f(X, model) 
f(X, model, reg = reg) 

我使用lambda來做到這一點:

f = lambda X, model: cost(X, model, sparse = np.random.rand(10,10)) 

和python抱怨lambda有一個意外的論據reg。我如何正確地做到這一點?

如果我做的其他方式:

f = lambda X, model, reg: cost(X, model, reg = reg, sparse = np.random.rand(10,10)) 

,則它不會在第一種情況下工作。

+1

在函數調用中,關鍵字參數必須跟隨位置參數。所以我認爲你的「成本」函數應該類似於成本(X,model,reg = 1e-3,sparse ='somethingelse'或'cost(X,model,sparse,req = 1e-3)' – poros

回答

12

LAMBDA公司採取相同的簽名定期的功能,你可以給reg默認:

f = lambda X, model, reg=1e3: cost(X, model, reg=reg, sparse=np.random.rand(10,10)) 

你給什麼默認要看是什麼默認cost功能分配到同一個參數。這些默認值存儲在cost.__defaults__結構中的該函數中,並與參數名稱匹配。這也許是最容易使用的inspect.getargspec() function內省這些信息:

from inspect import getargspec 

spec = getargspec(cost) 
cost_defaults = dict(zip(spec.args[-len(defaults:], spec.defaults)) 
f = lambda X, model, reg=cost_defaults['reg']: cost(X, model, reg=reg, sparse=np.random.rand(10,10)) 

或者,你可以只通過上任何額外的關鍵字參數:

f = lambda X, model, **kw: cost(X, model, sparse=np.random.rand(10,10), **kw) 
+0

lambda的默認參數應該與原函數中的相同 – Daniel

+0

任何不使用'partial()'的理由還是我錯過了什麼? – dhke

+0

@dhke:你是的;你需要執行'np.random。每次調用'f()'時都會調用rand()',而不是隻創建一次'partial()'。 –

4

你嘗試過類似

f = lambda X, model, **kw: cost(X, model, sparse = np.random.rand(10,10), **kw)

然後reg(和任何其他命名的參數喲你想通過(稀疏除外))應該工作正常。