Подтвердить что ты не робот

Необязательный аргумент в лямбда-функции

У меня есть функция:

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

И мне нужно передать эту функцию другой в форме:

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

Я использую лямбда для этого:

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

И python жалуется, что лямбда получила неожиданный аргумент reg. Как это сделать правильно?

Если я делаю иначе:

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

Тогда он не работает в первом случае.

4b9b3361

Ответ 1

Lambda принимает ту же подпись, что и обычные функции, и вы можете дать reg значение по умолчанию:

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

Что вы дадите ему, зависит от того, что по умолчанию функция 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))

Кроме того, вы можете просто передать любой дополнительный аргумент ключевого слова:

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

Ответ 2

Вы пробовали что-то вроде

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

then reg (и любой другой именованный аргумент, который вы хотите передать (кроме разреженного)), должен работать нормально.