Verwendung von *args und **kwargs
Ich habe also Schwierigkeiten mit dem Konzept von "args" und "kwargs".
Bis jetzt habe ich das gelernt:
*args
= Liste von Argumenten - als positionale Argumente
Ich verstehe nicht, für welche Programmieraufgabe dies hilfreich sein könnte.
Vielleicht:
Ich denke, um Listen und Wörterbücher als Argumente einer Funktion UND gleichzeitig als Platzhalter einzugeben, damit ich JEDES Argument übergeben kann?
Gibt es ein einfaches Beispiel, um zu erklären, wie *args
und **kwargs
verwendet werden?
Auch das Tutorial, das ich gefunden habe, verwendet nur das "*" und einen Variablennamen.
Sind *args
und **kwargs
nur Platzhalter oder verwenden Sie genau *args
und **kwargs
in Ihrem Code?
1361
3
Die Syntax ist die
*
und**
. Die Namen*args
und**kwargs
sind nur eine Konvention, aber es gibt keine zwingende Notwendigkeit, sie zu verwenden.Sie würden
*args
verwenden, wenn Sie nicht sicher sind, wie viele Argumente an Ihre Funktion übergeben werden, d.h. es erlaubt Ihnen, eine beliebige Anzahl von Argumenten an Ihre Funktion zu übergeben. Zum Beispiel:In ähnlicher Weise können Sie mit
**kwargs
benannte Argumente behandeln, die Sie nicht im Voraus definiert haben:Sie können diese auch zusammen mit benannten Argumenten verwenden. Die expliziten Argumente erhalten zuerst Werte und dann wird alles andere an
*args
und**kwargs
übergeben. Die benannten Argumente stehen in der Liste an erster Stelle. Zum Beispiel:Sie können auch beide in der gleichen Funktionsdefinition verwenden, aber
*args
muss vor**kwargs
stehen.Sie können auch die Syntax
*
und**
verwenden, wenn Sie eine Funktion aufrufen. Zum Beispiel:Wie Sie sehen können, wird in diesem Fall die Liste (oder das Tupel) von Elementen genommen und entpackt. Auf diese Weise werden sie mit den Argumenten in der Funktion abgeglichen. Natürlich können Sie ein "*" sowohl in der Funktionsdefinition als auch im Funktionsaufruf verwenden.
Ein Ort, an dem die Verwendung von
*args
und**kwargs
sehr nützlich ist, ist die Unterklassenbildung.Auf diese Weise kann man das Verhalten der Klasse Foo erweitern, ohne viel ueber Foo wissen zu muessen. Das kann sehr praktisch sein, wenn man für eine API programmiert, die sich ändern könnte. MyFoo übergibt einfach alle Argumente an die Foo-Klasse.
Die Namen
*args
und**kwargs
oder**kw
sind reine Konvention. Das macht es für uns einfacher, den Code des anderen zu lesen.Ein Ort, an dem es praktisch ist, ist bei der Verwendung des struct-Moduls
struct.unpack()" gibt ein Tupel zurück, während "struct.pack()" eine variable Anzahl von Argumenten verwendet. Bei der Manipulation von Daten ist es praktisch, ein Tupel an
struck.pack()
übergeben zu können, z.B.Ohne diese Möglichkeit wäre man gezwungen, zu schreiben
was auch bedeutet, dass ich, wenn sich die format_str ändert und die Größe des Tupels sich ändert, zurückgehen und diese wirklich lange Zeile bearbeiten muss