【问题标题】:Optional argument in lambda functionlambda 函数中的可选参数
【发布时间】:2020-07-25 19:29:01
【问题描述】:

我有一个函数:

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

那么它在第一种情况下不起作用。

【问题讨论】:

  • 在函数调用中,关键字参数必须跟在位置参数之后。所以我相信你的cost 函数应该类似于cost(X, model, reg=1e-3, sparse='somethingelse'cost(X, model, sparse, req=1e-3)

标签: python lambda


【解决方案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() 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))

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

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

【讨论】:

  • lambda 的默认参数应该和原始函数中的一样。
  • 有什么理由不使用partial() 还是我错过了什么?
  • @dhke:你是;您需要在每次调用f() 时执行np.random.rand() 调用,而不仅仅是在创建partial() 时执行一次。
  • @MartijnPieters 啊,lambda 在执行时重新评估参数!
  • 这不是什么特殊的 lambda 东西——他明确想要rand() re-executed
【解决方案2】:

你有没有尝试过类似的东西

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

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

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 2017-05-26
    • 2017-06-12
    • 2011-10-09
    • 2018-06-27
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多