Menu

Python *args und **kwargs: flexible positionelle und Keyword-Argumente

Was *args und **kwargs bedeuten, wann du sie einsetzt und wie du Argumente sauber zwischen Funktionen weiterreichst.

Wenn du nicht weißt, wie viele Argumente es werden

Die meisten Funktionen nehmen eine feste Anzahl Parameter. Gelegentlich brauchst du mehr Flexibilität — einen Logger, der beliebig viele Nachrichten annimmt, eine Wrapper-Funktion, die alles Eingegangene an eine andere Funktion weiterreicht, eine Plot-Funktion, die Konfiguration akzeptiert, ohne genau zu wissen, welche Optionen der Aufrufer nutzt.

Python löst das mit zwei besonderen Markierungen in der Parameterliste: *args und **kwargs.

*args sammelt positionelle Argumente

Ein einzelnes Sternchen heißt „packe alle zusätzlichen positionellen Argumente in ein Tupel“:

main.py
Output
Click Run to see the output here.

Innerhalb der Funktion ist args ein normales Tupel. Du kannst darüber schleifen, es indizieren, len() aufrufen oder slicen.

*args erscheint meist neben benannten Parametern:

main.py
Output
Click Run to see the output here.

first nimmt das erste Argument; *rest packt alles danach in ein Tupel.

**kwargs sammelt Keyword-Argumente

Zwei Sternchen machen das Gleiche für Keyword-Argumente und packen sie in ein Dict:

main.py
Output
Click Run to see the output here.

Innerhalb von describe ist kwargs ein normales Dict. Die Schlüssel sind die Keyword-Namen als Strings.

Beide zusammen nutzen

Du kannst beide in derselben Funktion verwenden. Konvention: *args vor **kwargs:

main.py
Output
Click Run to see the output here.

Die vollständige Parameterreihenfolge von links nach rechts:

  1. Normale positionelle Parameter (mit oder ohne Default).
  2. *args.
  3. Keyword-gebundene Parameter (alles nach *args muss per Schlüsselwort übergeben werden).
  4. **kwargs.
main.py
Output
Click Run to see the output here.

title nimmt das erste positionelle. Der Rest der positionellen geht in tags. draft muss per Schlüsselwort übergeben werden (es steht nach *tags). Weitere Keyword-Argumente landen in metadata.

Entpacken mit * und ** am Aufrufort

Die Sterne funktionieren auch umgekehrt — eine Sequenz oder ein Dict in die Argumente eines Aufrufs ausbreiten:

main.py
Output
Click Run to see the output here.

Das ist unglaublich praktisch zum Weiterleiten von Argumenten:

main.py
Output
Click Run to see the output here.

wrapped muss nicht wissen, welche Argumente log erwartet. Es sammelt alles und reicht es weiter. Dieses Muster taucht bei Dekoratoren (fortgeschrittener Stoff) und Wrapper-Funktionen ständig auf.

Wann *args und **kwargs die falsche Wahl sind

Es ist leicht, sich zu begeistern und sie überall einzusetzen. Zwei Warnungen:

Sie verbergen, was eine Funktion erwartet

Ist jede Funktion in deiner Codebase def f(*args, **kwargs), weiß der aufrufende Code nicht, welche Argumente gültig sind. Nutz benannte Parameter, wann immer du kannst, und lass *args/**kwargs nur echt variable Eingaben oder reines Weiterleiten tragen.

Fehlermeldungen werden vage

Ein falsch getippter Keyword-Name wird zu einem stillen None oder einem KeyError tief in der Funktion, statt einer sofortigen „unexpected keyword argument“-Meldung am Aufrufort. Benannte Parameter geben dir viel besseres Feedback.

Als Regel: bevorzug standardmäßig benannte Parameter und greif zu *args/**kwargs nur, wenn die Funktion echt flexibel ist oder Argumente an einen anderen Aufruf weiterleitet.

Ein kleines praktisches Beispiel

Ein Plot-ähnlicher Helfer, der eine Drittanbieterfunktion mit ein paar Defaults umschließt:

main.py
Output
Click Run to see the output here.

*values erlaubt Aufrufern, beliebig viele Elemente zu übergeben; **style schluckt zusätzliche Konfiguration, ohne dass jede Option ein benannter Parameter sein muss. Flexibel, aber nicht undurchsichtig, weil die innere Logik genau zeigt, welche Schlüssel aus style gelesen werden.

Zusammenfassung

  • *args packt zusätzliche positionelle Argumente in ein Tupel.
  • **kwargs packt zusätzliche Keyword-Argumente in ein Dict.
  • Am Aufrufort entpacken *seq und **dict in die andere Richtung.
  • Parameter müssen in der Reihenfolge erscheinen: normal → *args → keyword-only → **kwargs.
  • Nicht übertreiben — benannte Parameter sind klarer, wenn du sie nutzen kannst.

Als Nächstes: lambda, ein Weg, winzige Einweg-Funktionen inline zu schreiben.

Häufig gestellte Fragen

Was ist *args in Python?

*args sammelt alle zusätzlichen positionellen Argumente in einem Tupel. def f(*args): erlaubt den Aufruf f(1, 2, 3) und du bekommst args als (1, 2, 3). Der Name args ist Konvention — du könntest es anders nennen, aber *args nutzt jede.

Was ist **kwargs in Python?

**kwargs sammelt alle zusätzlichen Keyword-Argumente in einem Dict. def f(**kwargs): erlaubt den Aufruf f(name='Ada', age=30) und du bekommst kwargs als {'name': 'Ada', 'age': 30}. Zusammen erlauben *args und **kwargs einer Funktion jede Argumentkombination.

Muss ich sie args und kwargs nennen?

Nein, die Sterne zählen, nicht die Namen. *values und **options funktionieren genauso. Aber args und kwargs sind eine nahezu universelle Konvention in Python-Code — bleib dabei, solange es keinen konkreten Grund für Aussagekräftigeres gibt.

Lerne mit Coddy zu programmieren

LOS GEHT'S