/ / Python: opcjonalne argumenty dla funkcji wywołujących funkcje niższego poziomu - python, opcjonalne parametry

Python: opcjonalne argumenty dla funkcji wywołujących funkcje niższego poziomu - python, opcjonalne parametry

Mam funkcję

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

który musi wywoływać funkcję utraty poziomu niższego poziomu, która może być dowolną z tych wartości z wektorem i obcinaniem przekazanym jako argument:

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

Każda funkcja straty ma specjalną właściwą domyślną wartość przycinania, więc możemy nazywać je albo huber_loss (wektor), albo huber_loss (wektor, 2) na przykład.

Chcę, aby parametr przycinania był opcjonalny w wagach () bez podawania wartości domyślnej na poziomie wag, ponieważ dałoby to takie samo domyślne ustawienie dla wszystkich funkcji utraty, a to jest niewłaściwe.

Jak uczynić parametr obcinania opcjonalnym wciężary, więc jeśli nie podamy wartości, używa ona domyślnej wartości konkretnej funkcji straty? (wiem, że możemy ustawić domyślny obcinek = brak i przetestować w funkcji utraty, jeśli obcinanie = brak, a następnie ustawić obcinanie = 2,38 itd. ale uważam, że jest to o wiele bardziej elegancki sposób).

Próbowałem rozwiązać ten problem w następujący sposób:

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

ale jeśli chcemy nadać konkretną wartość przycinaniu bez określania max_iteracji i tolerancji, to nie działa.

Każdy pomysł, jak rozwiązać to w sposób pyton i elegancki?

Odpowiedzi:

1 dla odpowiedzi № 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 dla odpowiedzi nr 2

Możesz użyć max_iteracji, tolerancji i obcinania jako **kwargs i sprawdź obecność kluczy wewnątrz argumentów

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)

nie musisz przekazywać wszystkich sprawdzanych kwargów

PS. Jeśli znajdziesz odpowiedź, której potrzebujesz - zaakceptuj ją :)