lambda函数中的可选参数

时间:2015-06-20 21:13:10

标签: python lambda

我有一个功能:

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))

然后它在第一种情况下不起作用。

2 个答案:

答案 0 :(得分:16)

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)

答案 1 :(得分:5)

你试过像

这样的事吗?

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

然后reg(以及你要传递的任何其他命名参数(稀疏除外))应该可以正常工作。