2016-04-28 1 views
0

У меня есть функцияPython: необязательные аргументы для функции вызова функции нижнего уровня

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 (вектор) или huber_loss (вектор, 2), например.

Я хочу сделать параметр отсечения необязательным в weight() без указания значения по умолчанию на уровне весов, потому что это даст одинаковые значения по умолчанию для всех функций потерь, и это неправильно.

Как сделать параметр отсечения необязательным в весах, чтобы, если мы не даем значение, оно использует значение по умолчанию для конкретной функции потерь? (Я знаю, что мы можем установить отсечение по умолчанию = Нет и протестировать функцию потерь, если отсечение = Нет, тогда установите clipping = 2.38 и т. Д., Но я думаю, что есть намного более элегантный способ сделать это).

Я пытался решить проблему таким образом:

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

, но если мы хотим, чтобы дать определенное значение для отсечения без указания max_iterations и терпимости она не работает.

Любая идея, как решить это в питоническом и элегантном стиле?

+0

Является ли ваше использование '' 'clipping''' и' '' vector''' ограничивается только вызовом '' 'loss_function' ''? –

ответ

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

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

huber_loss(vector, **kwargs) 
0

Вы можете использовать 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. Если вы нашли ответ, что это то, что вам нужно - принять его :)