Python:函数调用低级函数的可选参数

时间:2016-04-28 11:27:40

标签: python optional-parameters

我有一个功能

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()中使剪切参数可选,而不在权重'处给出默认值。因为这会给所有损失函数提供相同的默认值,而且这是错误的。

如何使权重中的剪切参数可选,这样如果我们不给出值,它会使用特定损失函数的默认值? (我知道我们可以设置默认裁剪=无并在损失函数中测试如果裁剪=无则设置裁剪= 2.38等...但我认为这样做的方式更为优雅。)

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

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

但是如果我们想在没有指定max_iterations和容差的情况下给剪裁赋予特定值,那么它就不起作用。

任何想法如何以pythonic和优雅的方式解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

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

huber_loss(vector, **kwargs)

答案 1 :(得分:0)

您可以将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。如果你找到了你需要的答案 - 接受它:)