/ / Python: optionale Argumente für Funktionen, die Funktionen niedrigerer Ebene aufrufen - Python, optionale Parameter

Python: optionale Argumente für Funktionen, die Funktionen auf niedrigerer Ebene aufrufen - Python, optionale Parameter

Ich habe eine Funktion

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

die eine niedrigere Verlustfunktion aufrufen muss, die mit dem Vektor und dem in Argument übergebenen Clipping eine der folgenden sein kann:

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

Jede Verlustfunktion hat einen speziellen Standard-Abschneidewert, sodass wir sie beispielsweise entweder huber_loss (vector) oder huber_loss (vector, 2) nennen können.

Ich möchte den Abschneideparameter in weights () optional machen, ohne einen Standardwert auf Gewichtsebene anzugeben, da dies allen Verlustfunktionen den gleichen Standardwert geben würde, und das ist falsch.

So machen Sie den Beschneidungsparameter optional inGewichte so, dass, wenn wir keinen Wert angeben, der Standardwert der spezifischen Verlustfunktion verwendet wird (ich weiß, dass wir standardmäßige Beschneidungen festlegen können = None und in der Verlustfunktion testen, ob Abschneiden = Keine, dann Abschneiden = 2,38 usw. festlegen. aber ich denke, es gibt einen viel eleganteren Weg, dies zu tun.

Ich habe versucht, das Problem auf diese Weise zu lösen:

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

Wenn Sie jedoch einen bestimmten Wert für das Abschneiden festlegen möchten, ohne max_iterations und Toleranz anzugeben, funktioniert dies nicht.

Hast du eine Idee, wie du das auf pythonische und elegante Weise lösen kannst?

Antworten:

1 für die Antwort № 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 für die Antwort № 2

Sie können max_iterations, tolerance und clipping als verwenden **kwargs und prüfen, ob Schlüssel in Argumenten vorhanden sind

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)

Sie müssen nicht alle Kwargs passieren, die Sie überprüfen

PS. Wenn Sie eine Antwort finden, die Sie brauchen, akzeptieren Sie sie :)