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“:
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:
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:
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:
Die vollständige Parameterreihenfolge von links nach rechts:
- Normale positionelle Parameter (mit oder ohne Default).
*args.- Keyword-gebundene Parameter (alles nach
*argsmuss per Schlüsselwort übergeben werden). **kwargs.
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:
Das ist unglaublich praktisch zum Weiterleiten von Argumenten:
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:
*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
*argspackt zusätzliche positionelle Argumente in ein Tupel.**kwargspackt zusätzliche Keyword-Argumente in ein Dict.- Am Aufrufort entpacken
*seqund**dictin 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.