【问题标题】:Python : optional arguments for function calling lower level functionsPython:函数调用低级函数的可选参数
【发布时间】:2016-08-23 03:13:33
【问题描述】:

我有一个功能

def weights(vector, loss_function, clipping, max_iterations=100, tolerance=1e-5)

它需要调用一个较低级别的损失函数,该函数可以是其中任何一个,带有传入参数的向量和裁剪:

huber_loss(vector, clipping=2.38) cauchy_loss(vector, clipping=3.27) bisquare_loss(vector, clipping=1.04)

每个损失函数都有一个特殊的适当的默认裁剪值,因此我们可以将它们称为 huber_loss(vector) 或 huber_loss(vector,2) 例如。

我想在 weights() 中使裁剪参数可选,而不在权重级别提供默认值,因为这会给所有损失函数提供相同的默认值,这是错误的。

如何使裁剪参数在权重中成为可选参数,以便如果我们不给出值,它会使用特定损失函数的默认值? (我知道我们可以设置默认的 clipping=None 并在 loss 函数中进行测试,如果 clipping=None 然后设置 clipping = 2.38 等等。但我认为有一种更优雅的方法来做到这一点。

我试图以这种方式解决问题:

weights(vector, loss_function, max_iterations=100, tolerance=1e-5, *clipping)

但是如果我们想在不指定 max_iterations 和容差的情况下为裁剪提供特定值,则它不起作用。

知道如何以 Pythonic 和优雅的方式解决这个问题吗?

【问题讨论】:

  • 您对clippingvector 的使用是否仅限于调用loss_function

标签: python optional-parameters


【解决方案1】:
def weights(vector, loss_function, clipping=None, 
            max_iterations=100, tolerance=1e-5)

kwargs = {}
if clipping:
    kwargs['clipping'] = clipping

huber_loss(vector, **kwargs)

【讨论】:

  • 如果 clipping==0 它不传播参数。
【解决方案2】:

您可以将 max_iterations、tolerance 和 clipping 用作 **kwargs 并检查参数中是否存在键

def weights(vector, loss_function, **kwargs):
  if kwargs['max_iterations']:
    max_iterations = kwargs['max_iterations']
  else:
    max_iterations = 100
  ... # and so go on for clipping and tolerance

weights(vect, lf, maxa_iterations=5, clipping=2) 

你不需要传递你检查的所有 kwargs

PS。如果你找到了你需要的答案 - 接受它:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 2019-05-19
    • 2023-03-21
    • 2013-07-17
    • 1970-01-01
    • 2012-04-09
    相关资源
    最近更新 更多