我有一个功能:
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))
然后它在第一种情况下不起作用。
答案 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
(以及你要传递的任何其他命名参数(稀疏除外))应该可以正常工作。