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

Python : optional arguments for function calling lower level functions

我有一个功能

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 并在损失函数中测试 if clipping=None 然后设置 clipping = 2.38 等等。但我认为有更优雅的方法来做到这一点)。

我试过这样解决问题:

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

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

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

您可以使用 max_iterations、公差和裁剪作为 **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。如果您找到所需的答案 - 接受它:)

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

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

huber_loss(vector, **kwargs)