HOWTO · Python

Übergeben Sie Kwargs an eine andere Funktion in Python

Erfahre, wie Schlüsselwortargumente in Python funktionieren, wie **kwargs sie in einem Dictionary sammelt und wie du dieses Dictionary an eine andere Funktion weiterleitest.

Auf dieser Seite

Um ein Wörterbuch mit Schlüsselwortargumenten an eine andere Python-Funktion zu übergeben, rufen Sie sie mit **mapping auf, zum Beispiel mit display(**details). Python entpackt jedes Schlüssel-Wert-Paar zu einem benannten Argument. Eine Funktion kann mit einem **kwargs-Parameter beliebig viele solcher Argumente sammeln und sie auf dieselbe Weise weitergeben.

Schlüsselwortargumente in Python

Schlüsselwortargumente ordnen Werte bei einem Funktionsaufruf Parameternamen zu. Schreiben Sie jedes Argument als name=value; beispielsweise übergibt greet(first="Anne", age=27) die Werte anhand ihrer Namen. Die Funktion muss Parameter definieren, die diese Namen annehmen. Die Werte werden den passenden Parametern zugewiesen, unabhängig von ihrer Position im Aufruf.

Dieser Stil macht Aufrufe leichter lesbar, wenn eine Funktion mehrere Parameter hat. Außerdem kann der Aufrufer so nur optionale Parameter angeben und Parameter mit Standardwerten unverändert lassen. Die Namen in einem Aufruf mit Schlüsselwortargumenten müssen den Parameternamen der Funktion entsprechen, es sei denn, die Funktion nimmt über **kwargs zusätzliche Schlüsselwortargumente an.

Eine Funktion mit **kwargs in Python aufrufen

Setzen Sie in einer Funktionsdefinition ** vor einen Parameternamen, um Schlüsselwortargumente zu sammeln, für die keine eigenen benannten Parameter definiert sind. Üblicherweise heißt dieser Parameter kwargs, er kann aber jeden gültigen Variablennamen haben. Innerhalb der Funktion stellt Python die gesammelten Werte als Wörterbuch bereit.

Zum Beispiel kann def describe(**kwargs): ... einen Aufruf wie describe(name="Rabbit", sound="squeak") entgegennehmen. Das entstehende Wörterbuch enthält zwei Einträge: name ist "Rabbit" und sound ist "squeak" zugeordnet. So kann eine Funktion benannte Optionen annehmen, ohne jede davon in ihrer Signatur aufzuführen. Sie kann das Wörterbuch untersuchen, einzelne Werte auswählen oder es an eine andere Funktion weitergeben.

*args erfüllt einen ähnlichen Zweck für Positionsargumente: Es sammelt zusätzliche Positionswerte in einem Tupel. Verwenden Sie *args für Positionswerte und **kwargs für Schlüsselwortwerte; **args ist nicht die entsprechende Schreibweise zum Sammeln von Positionsargumenten.

**kwargs an eine andere Funktion in Python übergeben

Eine Funktion kann ein Wörterbuch weitergeben, indem sie beim Aufruf ** vor den Namen des Wörterbuchs setzt. Im Beispiel sammelt info zunächst details; anschließend entpackt info die Einträge beim Aufruf von show_details. Die aufgerufene Funktion erhält die Wörterbucheinträge über ihren eigenen **kwargs-Parameter als benannte Parameter.

def show_details(**kwargs):
    for key, value in kwargs.items():
        print(key, value)


def info(**kwargs):
    show_details(**kwargs)


details = {"name": "Shen", "age": 27, "degree": "SE"}
info(**details)
name Shen
age 27
degree SE

Der Aufruf info(**details) entpackt die Zuordnung in Schlüsselwortargumente für info. Diese Funktion sammelt sie in ihrem lokalen Wörterbuch kwargs, und show_details(**kwargs) entpackt dieselben Einträge für den nächsten Aufruf. Die Schleife gibt jeden Schlüssel und seinen Wert aus. Die unveränderte Beispielausgabe zeigt die Einträge name, age und degree mit den Werten Shen, 27 und SE; die sichtbaren Bezeichnungen bleiben auf Englisch. Stimmen Sie die Schlüssel des Wörterbuchs auf die Namen ab, die die empfangende Funktion akzeptiert. Wenn sie ausdrückliche Parameter deklariert, muss jeder Schlüssel einem davon entsprechen oder von ihrem **kwargs-Parameter angenommen werden.

Die weiterleitende Funktion muss nicht jeden Schlüssel im Voraus kennen. Dieses Muster eignet sich für Wrapper, die einen anderen Aufruf ergänzen und dabei die vom Aufrufer übergebenen Optionen weiterreichen. Hat ein Wrapper außerdem ausdrückliche Parameter, definieren Sie diese in seiner Signatur vor **kwargs und leiten Sie anschließend nur die gesammelten Schlüsselwortargumente weiter, die benötigt werden.

Fazit

Verwenden Sie name=value, um ein gewöhnliches Schlüsselwortargument zu übergeben, **kwargs in einer Definition, um zusätzliche Schlüsselwortargumente in einem Wörterbuch zu sammeln, und **mapping in einem Aufruf, um ein Wörterbuch für eine andere Funktion zu entpacken. Für Positionsargumente verwenden Sie *args. Damit die Weitergabe zuverlässig funktioniert, müssen die Wörterbuchschlüssel den von der empfangenden Funktion akzeptierten Parameternamen entsprechen.