Wozu dient **kwargs
Python?
Ich weiß, dass Sie einen objects.filter
auf einem Tisch machen und ein **kwargs
Argument übergeben können.
Kann ich dies auch tun, um Zeitdeltas anzugeben, dh timedelta(hours = time1)
?
Wie genau funktioniert es? Ist es Klassen als "Auspacken"? Wie a,b=1,2
?
kwargs
steht fürKeyWord ARGumentS
, dh Argumente, die Schlüssel gesetzt habenAntworten:
Sie können verwenden
**kwargs
, damit Ihre Funktionen eine beliebige Anzahl von Schlüsselwortargumenten annehmen ("kwargs" bedeutet "Schlüsselwortargumente"):Sie können die
**kwargs
Syntax auch beim Aufrufen von Funktionen verwenden, indem Sie ein Wörterbuch mit Schlüsselwortargumenten erstellen und an Ihre Funktion übergeben:Das Python-Tutorial enthält eine gute Erklärung der Funktionsweise sowie einige schöne Beispiele.
<--Update-->
Verwenden Sie für Benutzer von Python 3 anstelle von iteritems () items ()
quelle
Wörterbücher auspacken
**
packt Wörterbücher aus.Diese
ist das gleiche wie
Es ist nützlich, wenn Sie Parameter erstellen müssen:
Packparameter einer Funktion
Auf diese Weise können Sie die folgende Funktion verwenden:
quelle
** do unpack dictionaries.
>> umwerfend / natürlich! +1 für die Erklärung dieses Bits..iteritems()
wurde.items()
in Python 3 umbenannt .kwargs ist nur ein Wörterbuch, das den Parametern hinzugefügt wird.
Ein Wörterbuch kann Schlüssel-Wert-Paare enthalten. Und das sind die Kwargs. Ok, so geht das.
Das Wofür ist nicht so einfach.
Zum Beispiel (sehr hypothetisch) haben Sie eine Schnittstelle, die nur andere Routinen aufruft, um die Arbeit zu erledigen:
Jetzt erhalten Sie eine neue Methode "Laufwerk":
Aber Moment mal, es gibt einen neuen Parameter "Fahrzeug" - Sie haben es vorher nicht gewusst. Jetzt müssen Sie es der Signatur der myDo-Funktion hinzufügen.
Hier können Sie Kwargs ins Spiel bringen - Sie fügen der Signatur einfach Kwargs hinzu:
Auf diese Weise müssen Sie die Signatur Ihrer Schnittstellenfunktion nicht jedes Mal ändern, wenn sich einige Ihrer aufgerufenen Routinen ändern.
Dies ist nur ein schönes Beispiel, das Sie als hilfreich erachten könnten.
quelle
Auf der Grundlage, dass eine gute Stichprobe manchmal besser ist als ein langer Diskurs, schreibe ich zwei Funktionen unter Verwendung aller Übergabemöglichkeiten für Python-Variablenargumente (sowohl Positions- als auch benannte Argumente). Sie sollten leicht selbst sehen können, was es tut:
Und hier ist die Ausgabe:
quelle
Motiv:
*args
und**kwargs
dient als Platzhalter für die Argumente, die an einen Funktionsaufruf übergeben werden müssenVerwenden
*args
und**kwargs
Aufrufen einer FunktionJetzt
*args
rufen wir die oben definierte Funktion aufErgebnis:
arg1: zwei
arg2: 3
arg3: 5
Verwenden Sie nun
**kwargs
, um dieselbe Funktion aufzurufenErgebnis:
arg1: 5
arg2: zwei
arg3: 3
Fazit: Hat
*args
keine Intelligenz, interpoliert einfach die übergebenen Argumente auf die Parameter (in der Reihenfolge von links nach rechts) und**kwargs
verhält sich intelligent, indem der entsprechende Wert an der gewünschten Stelle platziert wirdquelle
kwargs
in**kwargs
ist nur Variablenname. Sie können sehr gut haben**anyVariableName
kwargs
steht für "Schlüsselwortargumente". Ich bin jedoch der Meinung, dass sie besser als "benannte Argumente" bezeichnet werden sollten, da dies einfach Argumente sind, die zusammen mit Namen weitergegeben werden (ich finde keine Bedeutung für das Wort "Schlüsselwort" im Begriff "Schlüsselwortargumente". Ich denke, "Schlüsselwort" bedeutet normalerweise Wörter, die von der Programmiersprache reserviert sind und daher vom Programmierer nicht für Variablennamen verwendet werden dürfen. Bei kwargs passiert hier nichts dergleichen.). Wir geben also Namenparam1
undparam2
zwei Parameterwerte an die Funktion wie folgt übergeben:func(param1="val1",param2="val2")
anstatt nur Werte zu übergeben :func(val1,val2)
. Ich bin daher der Meinung, dass sie angemessen als "beliebige Anzahl benannter Argumente" bezeichnet werden sollten, da wir eine beliebige Anzahl dieser Parameter angeben können (d. H.func
func(**kwargs)
Lassen Sie mich also zuerst "benannte Argumente" und dann "beliebige Anzahl benannter Argumente" erklären
kwargs
.Benannte Argumente
Beispiel
Beliebige Anzahl benannter Argumente
kwargs
Beispiel
Übergeben von Tupel- und Diktiervariablen für benutzerdefinierte Argumente
Lassen Sie mich zum Schluss noch bemerken, dass wir bestehen können
Somit kann der gleiche obige Aufruf wie folgt erfolgen:
Schließlich beachten
*
und**
in Funktionsaufrufen oben. Wenn wir sie weglassen, können wir schlechte Ergebnisse erzielen.Auslassen
*
in Tupelargumenten :druckt
Das obige Tupel
('custom param1', 'custom param2', 'custom param3')
wird so gedruckt, wie es ist.Argumente weglassen
dict
:gibt
quelle
keyword
Terminologie von der Tatsache herrührt, dass Sie ein Diktat übergeben, das eine Datenbank von Schlüssel-Wert-Paaren ist.Zusätzlich können Sie beim Aufrufen von kwargs-Funktionen verschiedene Verwendungsarten mischen:
gibt diese Ausgabe:
Beachten Sie, dass ** kwargs das letzte Argument sein muss
quelle
kwargs sind ein syntaktischer Zucker, um Namensargumente als Wörterbücher (für func) oder Wörterbücher als benannte Argumente (für func) zu übergeben.
quelle
Hier ist eine einfache Funktion, die zur Erklärung der Verwendung dient:
Alle Argumente, die nicht in der Funktionsdefinition angegeben sind, werden in die
args
Liste oder in diekwargs
Liste aufgenommen, je nachdem, ob es sich um Schlüsselwortargumente handelt oder nicht:Wenn Sie ein Schlüsselwortargument hinzufügen, das niemals an eine Funktion übergeben wird, wird ein Fehler ausgegeben:
quelle
Hier ist ein Beispiel, von dem ich hoffe, dass es hilfreich ist:
Wenn Sie das Programm ausführen, erhalten Sie:
Der Schlüssel zum Mitnehmen ist, dass die variable Anzahl der benannten Argumente im Aufruf in ein Wörterbuch in der Funktion übersetzt wird.
quelle
Dies ist das einfache Beispiel für das Auspacken von Python .
eg1:
quelle
In Java verwenden Sie Konstruktoren, um Klassen zu überladen und mehrere Eingabeparameter zuzulassen. In Python können Sie kwargs verwenden, um ein ähnliches Verhalten bereitzustellen.
Java-Beispiel: https://beginnersbook.com/2013/05/constructor-overloading/
Python-Beispiel:
nur eine andere Art, darüber nachzudenken.
quelle
Schlüsselwortargumente werden in Python häufig zu kwargs verkürzt . In Computer - Programmierung ,
Die Verwendung der beiden Sternchen vor dem Parameternamen ** kwargs ist, wenn man nicht weiß, wie viele Schlüsselwortargumente an die Funktion übergeben werden. In diesem Fall wird es als Arbitrary / Wildcard Keyword Arguments bezeichnet.
Ein Beispiel hierfür sind die Empfängerfunktionen von Django .
Beachten Sie, dass es nicht kwargs heißen muss , sondern ** (der Name kwargs ist eine Konvention).
quelle