lambda函数中的可选参数

Dzu*_*yen 18 python lambda

我有一个功能:

cost(X, model, reg = 1e-3, sparse)
Run Code Online (Sandbox Code Playgroud)

我需要在以下形式下将此函数传递给另一个函数:

f(X, model)
f(X, model, reg = reg)
Run Code Online (Sandbox Code Playgroud)

我正在使用lambda来做到这一点:

f = lambda X, model: cost(X, model, sparse = np.random.rand(10,10))
Run Code Online (Sandbox Code Playgroud)

并且python抱怨lambda得到了意想不到的参数reg.我该怎么做呢?

如果我做其他方式:

f = lambda X, model, reg: cost(X, model, reg = reg, sparse = np.random.rand(10,10))
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 18

Lambda采用与常规函数相同的签名,您可以提供reg默认值:

f = lambda X, model, reg=1e3: cost(X, model, reg=reg, sparse=np.random.rand(10,10))
Run Code Online (Sandbox Code Playgroud)

您给出的默认值取决于cost函数为同一参数分配的默认值.这些默认值存储在cost.__defaults__结构中的该函数上,与参数名称匹配.使用该inspect.getargspec()函数来内省该信息可能是最简单的:

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))
Run Code Online (Sandbox Code Playgroud)

或者,您可以传递任何额外的关键字参数:

f = lambda X, model, **kw: cost(X, model, sparse=np.random.rand(10,10), **kw)
Run Code Online (Sandbox Code Playgroud)


Pet*_*ppi 5

你尝试过类似的东西吗?

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

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