Python kwargs – keyword arguments
Python Funktionen enthalten in der Regel Parameter. Meistens werden neben den normalen Parametern auch Parameter, die einen Standardwert bzw default bereits in der Funktionsdefinition enthalten, benutzt.
Positionsgebunden oder über Schlüsselwort
Ein einfaches Beispiel:
def welcome(first_name, last_name="Last Name"):
print(first_name, last_name)
Die Funktion welcome besitzt zwei Parameter: first_name und last_name
Der zweite Parameter last_name hat per Funktionsdefinition bereits einen Standardwert zugewiesen bekommen. Wird nun beim Funktionsaufruf das Argument für last_name weggelassen, so wird dem Parameter automatisch der Standartwert zugewiesen. Andernfalls benutzt der Interpreter das entsprechende Argument.
>>> welcome("Christian")
Christian Last Name
>>> welcome("Christian", last_name="Scholz")
Christian Scholz
Parameter über deren Position ansprechen – positional
Die Reihenfolge der Argumente spielt, je nachdem wie man die Funktion aufruft, eine Rolle. Werden die Argumente direkt übergeben, ist die Reihenfolge zwingend einzuhalten.
def simple_function(param_a, param_b, param_c="C", param_d="D"):
print("Parameter a: ", param_a)
print("Parameter b: ", param_b)
print("Parameter c: ", param_c)
print("Parameter d: ", param_d)
Aufruf und Ausgabe:
>>> simple_function("A", "B", "c", "d")
Parameter a: A
Parameter b: B
Parameter c: c
Parameter d: d
Wie oben bereits erklärt, können die Argumente für Parameter mit einem Standardwert weggelassen werden. Man beachte dabei, wie sich die Ausgabe für Parameter c und d ändert. Wird das letzte (vierte) Argument im Funktionsaufruf weggelassen, werden die Argumente eins bis drei entsprechend übergeben. Der Interpreter wertet Argumente von links nach rechts aus.
>>> simple_function("A", "B", "d")
Parameter a: A
Parameter b: B
Parameter c: d
Parameter d: D
>>> simple_function("A", "B")
Parameter a: A
Parameter b: B
Parameter c: C
Parameter d: D
Parameter über Schlüsselwort ansprechen – keywords
Möchten man nun ganz konkret ein Argument für Parameter D übergeben, jedoch nicht Parameter C, stellt man dem Argument den entsprechenden Parameter Namen als Schlüsselwort voran (keyword argument). Die ersten beiden Argumente für Parameter A und B können natürlich nicht entfallen, da diese keine Standardwerte zugewiesen bekommen haben.
>>> ("A", "B", param_d="d")
Parameter a: A
Parameter b: B
Parameter c: C
Parameter d: d
Übergibt man auch die Argumente der ersten beiden Parameter mit ihren Schlüsselwörtern, entsteht dadurch die Freiheit, die Reihenfolge der Argumente beliebig zu ändern.
>>> simple_function(param_b="b", param_c="c", param_d="d", param_a="a")
Parameter a: a
Parameter b: b
Parameter c: c
Parameter d: d
Parameter nur über Schlüsselwort definieren
Eine weit weniger gebräuchliche Variante sind keyword-only Parameter. Diese Parameter können ausschließlich über ihren Namen angesprochen werden und sind positionsunabhängig.
Keyword-only Parameter folgen entweder einem variablen positions Parameter (siehe *args oder einem einfachen ‚*‘
Zunächst ein Code Beispiel einer entsprechenden Funktion.
def keywords_only_function(*, keyword_a, keyword_b):
print("Keyword a: ", keyword_a)
print("Keyword b: ", keyword_b)
Der Aufruf ist nur möglich, wenn den Argumenten die entsprechenden Parameter Schlüsselwörter vorangestellt sind. Andernfalls erhält man eine Fehlermeldung.
>>> keywords_only_function(keyword_a="a", keyword_b="b")
Keyword a: a
Keyword b: b
>>> keywords_only_function("a", "b")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: keywords_only_function() takes 0 positional arguments but 2 were given
Variable Anzahl von Parametern über Position oder Schlüsselwort
Die letzte Variante der Parameterdefinition habe ich bereits in meinem Beitrag über *args und **kwargs genauer beschrieben. Dort werden positions und keyword Parameter mit einer variablen Anzahl definiert.
Wer sich noch weiter in die Python Dokumentation dazu einlesen möchte, findet diese unter https://docs.python.org/3/reference/compound_stmts.html#function-definitions