Wie unterscheiden sich "Schlüsselwortargumente" von regulären Argumenten? Können nicht alle Argumente als name=value
anstelle der Positionssyntax übergeben werden?
289
Wie unterscheiden sich "Schlüsselwortargumente" von regulären Argumenten? Können nicht alle Argumente als name=value
anstelle der Positionssyntax übergeben werden?
Antworten:
Es gibt zwei verwandte Konzepte, die beide als " Schlüsselwortargumente " bezeichnet werden.
Auf der aufrufenden Seite, wie andere Kommentatoren erwähnt haben, können Sie einige Funktionsargumente nach Namen angeben. Sie müssen sie nach allen Argumenten ohne Namen ( Positionsargumente ) erwähnen , und es müssen Standardwerte für alle Parameter vorhanden sein, die überhaupt nicht erwähnt wurden.
Das andere Konzept ist auf der Seite der Funktionsdefinition: Sie können eine Funktion definieren, die Parameter nach Namen nimmt - und Sie müssen nicht einmal angeben, wie diese Namen lauten. Dies sind reine Schlüsselwortargumente und können nicht positionell übergeben werden. Die Syntax lautet
Alle Schlüsselwortargumente, die Sie an diese Funktion übergeben, werden in ein Wörterbuch mit dem Namen eingefügt
kwargs
. Sie können die Schlüssel dieses Wörterbuchs zur Laufzeit folgendermaßen untersuchen:quelle
kwargs
oder kann ich ihn in etw umbenennen? wieoptions
(def my_fuction(arg1, arg2, **options)
)?kwargs
ist aber die Konvention, wenn es keinen passenderen Namen gibtEs gibt ein letztes Sprachmerkmal, bei dem die Unterscheidung wichtig ist. Betrachten Sie die folgende Funktion:
Das
*positional
Argument speichert alle an übergebenen Positionsargumentefoo()
, ohne die Anzahl der von Ihnen angegebenen zu begrenzen.Das
**keywords
Argument speichert alle Schlüsselwortargumente:Und natürlich können Sie beide gleichzeitig verwenden:
Diese Funktionen werden selten verwendet, sind jedoch gelegentlich sehr nützlich, und es ist wichtig zu wissen, welche Argumente Positions- oder Schlüsselwörter sind.
quelle
*positional
und**keywords
wenn wir die Funktionsdefinition wie änderndef foo(arg1, *positional, **keywords):
. Hierarg1
ist positionell und erforderlich. Bitte beachten Sie, dass die Position in der Antwort eine optionale und variable Anzahl von Positionsargumenten bedeutet.foo(bar=True)
, können Sie die Werte mitbar = keywords.pop('bar')
denselben wie erhaltenbar = keywords.pop('bar', None)
. Verwenden Sie als Standardwertbar = keywords.pop('bar', False)
Die Verwendung von Schlüsselwortargumenten ist dasselbe wie normale Argumente, außer dass die Reihenfolge keine Rolle spielt. Zum Beispiel sind die beiden folgenden Funktionsaufrufe gleich:
quelle
Positionsargumente
Sie haben keine Schlüsselwörter vor sich. Die Reihenfolge ist wichtig!
Schlüsselwortargumente
Sie haben Schlüsselwörter in der Front. Sie können in beliebiger Reihenfolge sein!
Sie sollten auch wissen, dass die Reihenfolge wichtig ist, wenn Sie Standardargumente verwenden und das Einfügen der Schlüsselwörter vernachlässigen!
quelle
func("bar", 5)
? Und dann sagen, dashello
bekommt seinen Standardwert von3
.Es gibt zwei Möglichkeiten, Funktionsparametern Argumentwerte zuzuweisen. Beide werden verwendet.
Nach Position. Positionsargumente haben keine Schlüsselwörter und werden zuerst zugewiesen.
Nach Stichwort. Schlüsselwortargumente haben Schlüsselwörter und werden nach Positionsargumenten an zweiter Stelle zugewiesen.
Beachten Sie, dass Sie die Option haben, Positionsargumente zu verwenden.
Wenn Sie keine Positionsargumente verwenden, stellt sich heraus, dass alles , was Sie geschrieben haben, ein Schlüsselwortargument ist.
Wenn Sie eine Funktion aufrufen, entscheiden Sie sich für die Verwendung von Position, Schlüsselwort oder einer Mischung. Sie können alle Schlüsselwörter auswählen, wenn Sie möchten. Einige von uns treffen diese Wahl nicht und verwenden Positionsargumente.
quelle
Ich bin überrascht, dass niemand darauf hingewiesen zu haben scheint, dass man ein Wörterbuch mit Parametern mit Schlüsselargumenten übergeben kann, die die formalen Parameter erfüllen.
quelle
, **kwargs
. Dies würde zeigen, dass sogar eine einfache func def mit einer festen Anzahl von Parametern ein Wörterbuch liefern kann. Das heißt, es erfordert nichts Besonderes in der Definition. DANN können Sie ein zweites Beispiel hinzufügen, WITH ** kwargs in der Definition, und zeigen, wie EXTRA-Elemente im Wörterbuch darüber verfügbar sind.print 'a:%s, b:%s, c:%s' % (a, b, c)
gibt es Syntaxfehler,print('a:%s, b:%s, c:%s' % (a, b, c))
funktioniert aber. Etwas mit Python-Version? Trotzdem danke für diesen Einblick, bis jetzt habe ich denprint('a:{}, b:{}, c:{}'.format(a, b, c))
Mit 3 Python Sie können beide erforderlich und nicht erforderlich Schlüsselwort Argumente :
Optional : (Standardwert für Parameter 'b' definiert)
Erforderlich (kein Standardwert für Parameter 'b' definiert):
Dies kann in Fällen hilfreich sein, in denen viele ähnliche Argumente nebeneinander stehen, insbesondere wenn sie vom gleichen Typ sind. In diesem Fall bevorzuge ich die Verwendung benannter Argumente oder erstelle eine benutzerdefinierte Klasse, wenn Argumente zusammengehören.
quelle
Ich bin überrascht, dass niemand die Tatsache erwähnt hat, dass Sie Positions- und Schlüsselwortargumente mischen können, um hinterhältige Dinge wie diese mit
*args
und**kwargs
( von dieser Site ) zu tun :Auf diese Weise können Sie beliebige Schlüsselwortargumente verwenden, die möglicherweise Schlüssel enthalten, die Sie nicht im Voraus definieren möchten.
quelle
Ich suchte nach einem Beispiel mit Standard-Warns mithilfe von Typanmerkungen:
Beispiel:
quelle
Fügen Sie einfach eine Möglichkeit zum Definieren des Standardwerts von Argumenten hinzu, die beim Aufrufen der Funktion nicht in Schlüsselwörtern zugewiesen werden:
Nennen Sie dies durch:
Du wirst kriegen:
Lesen Sie mehr über
*args
und**kwargs
in Python: https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3quelle