Ich verstehe das folgende Beispiel nicht, sagen wir, 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 die falsche? **kwargs
ist im Grunde ein Diktat. Wenn ich also das Argument an openX weitergeben möchte, denke ich, wäre der richtige Weg ohne **
und nur das Diktat zu geben. Aber Python mag das zweite offensichtlich nicht und sagt mir, dass ich 3 statt 2 Argumente gegeben habe. Was ist der Grund dafür?
**args
im Code nennen. Dies ist möglicherweise der schlechteste Name, mit dem die Leute ihn verwechseln werden*args
Antworten:
Im zweiten Beispiel geben Sie drei Argumente an: Dateiname, Modus und ein Wörterbuch (
kwargs
). Python erwartet jedoch: 2 formale Argumente plus Schlüsselwortargumente.Indem Sie dem Wörterbuch '**' voranstellen, entpacken Sie das Wörterbuch
kwargs
in Schlüsselwortargumente.Ein Wörterbuch (Typ
dict
) ist eine einzelne Variable, die Schlüssel-Wert-Paare enthält."Schlüsselwortargumente" sind Schlüsselwert-Methodenparameter.
Jedes Wörterbuch kann in Schlüsselwortargumente entpackt werden, indem es
**
während des Funktionsaufrufs vorangestellt wird .quelle
Die
**
Syntax weist Python an, Schlüsselwortargumente in einem Wörterbuch zu sammeln. Dassave2
gibt es als Nicht-Schlüsselwort-Argument (ein Wörterbuchobjekt) weiter. DasopenX
sieht keine Schlüsselwortargumente, so dass das**args
nicht verwendet wird. Stattdessen wird ein drittes Argument ohne Schlüsselwort (das Wörterbuch) angezeigt. Um dies zu beheben, ändern Sie die Definition deropenX
Funktion.quelle
Das folgende Beispiel, das die Antwort von @gecco erweitert, zeigt Ihnen den Unterschied:
Hier können Sie sehen, wie das Entpacken eines Wörterbuchs funktioniert und warum das Senden eines tatsächlichen Wörterbuchs fehlschlägt
quelle
Weil ein Wörterbuch ein einzelner Wert ist. Sie müssen die Schlüsselworterweiterung verwenden, wenn Sie sie als Gruppe von Schlüsselwortargumenten übergeben möchten.
quelle
Für # 2 ist args nur ein formaler Parameter mit dict-Wert, jedoch kein Parameter vom Typ Schlüsselwort.
Wenn Sie einen Schlüsselworttyp-Parameter an ein Schlüsselwortargument übergeben möchten, müssen Sie vor Ihrem Wörterbuch ** angeben, was ** Argumente bedeutet
Weitere Informationen zur Verwendung von ** kw finden Sie hier
http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/
quelle