2015-06-20 98 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(和任何其他命名的参数哟你想通过(稀疏除外))应该工作正常。