pass **kwargs argument an eine andere Funktion mit **kwargs
Verstehe ich nicht das folgende Beispiel, können sagen, ich habe diese Funktionen:
# python likes
def save(filename, data, **kwargs):
fo = openX(filename, "w", **kwargs) # <- #1
fo.write(data)
fo.close()
# python doesnt like
def save2(filename, data, **kwargs):
fo = openX(filename, "w", kwargs) # <- #2
fo.write(data)
fo.close()
def openX(filename, mode, **kwargs):
#doing something fancy and returning a file object
Warum ist #1 die richtige Lösung und #2 falsch? **kwargs
ist im Grunde ein dict, also Wenn ich will, zu überliefern, das argument zu openX ich denke der richtige Weg wäre, ohne **
und damit nur die dict. Aber python offensichtlich nicht, wie die zweite und sagt mir, ich gab 3 statt 2 Argumente.
So was ist der Grund dafür?
InformationsquelleAutor der Frage | 2012-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im zweiten Beispiel die Sie 3 Argumente: Dateiname, Modus und einem Wörterbuch (
kwargs
). Aber Python erwartet: 2 formale Argumente plus keyword-Argumente.Durch voranstellen des Wörterbuches durch '**' entpacken Sie das Wörterbuch
kwargs
zu Schlüsselwort-Argumente.Einem Wörterbuch (Typ
dict
) ist eine einzelne variable mit Schlüssel-Wert-Paare."Keyword-Argumente" sind Schlüssel-Wert-Methode-Parameter.
Jedem Wörterbuch kann durch entpackt keyword-Argumente, indem Sie mit
**
beim Funktionsaufruf.InformationsquelleAutor der Antwort gecco
Den
**
syntax sagt Python zum sammeln von keyword-Argumente in einem dictionary. Diesave2
ist vorbei es ab, wie ein non-keyword Arguments (eines dictionary-Objekts). DieopenX
ist nicht zu sehen, jede keyword-Argumente, so dass die**args
nicht verwendet. Es ist stattdessen immer eine Dritte non-keyword Arguments (das Wörterbuch). Zu beheben, ändern Sie die definition desopenX
Funktion.InformationsquelleAutor der Antwort Keith
Weil ein Wörterbuch ist ein einzelner Wert. Sie müssen verwenden Sie keyword-Erweiterung, wenn Sie möchten, übergeben Sie es als eine Gruppe von Schlüsselwort-Argumenten.
InformationsquelleAutor der Antwort Ignacio Vazquez-Abrams
#2
args wird nur eine formale parameter mit dict-Wert, aber nicht ein Schlüsselwort type-parameter.
Wenn Sie wollen, eine keyword type parameter in eine Schlüsselwort-argument
Sie müssen bestimmte ** vor Ihrem Wörterbuch, was bedeutet, **args
check this out für mehr Details zu den mit **kw
http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/
InformationsquelleAutor der Antwort Kit Ho