851 Stimmen

Was ist der Zweck und die Verwendung von **kwargs?

Was sind die Verwendungszwecke für **kwargs Pythonで?

Ich weiß, dass Sie eine objects.filter auf einen Tisch legen und eine **kwargs Argument.  

Kann ich dies auch für die Angabe von Zeitdeltas tun, d. h. timedelta(hours = time1) ?

Wie funktioniert das genau? Wird es als "Auspacken" klassifiziert? Wie a,b=1,2 ?

8 Stimmen

Eine bemerkenswert prägnante Erklärung aquí : "* sammelt alle Positionsargumente in einem Tupel", "** sammelt alle Schlüsselwortargumente in einem Wörterbuch". Das Schlüsselwort ist sammelt .

951voto

Pär Wieslander Punkte 27590

Sie können verwenden **kwargs um Ihre Funktionen eine beliebige Anzahl von Schlüsselwortargumenten annehmen zu lassen ("kwargs" bedeutet "Schlüsselwortargumente"):

>>> def print_keyword_args(**kwargs):
...     # kwargs is a dict of the keyword args passed to the function
...     for key, value in kwargs.iteritems():
...         print "%s = %s" % (key, value)
... 
>>> print_keyword_args(first_name="John", last_name="Doe")
first_name = John
last_name = Doe

Sie können auch die **kwargs Syntax beim Aufruf von Funktionen, indem Sie ein Wörterbuch mit Schlüsselwortargumenten erstellen und es an Ihre Funktion übergeben:

>>> kwargs = {'first_name': 'Bobby', 'last_name': 'Smith'}
>>> print_keyword_args(**kwargs)
first_name = Bobby
last_name = Smith

El Python-Anleitung enthält eine gute Erklärung der Funktionsweise sowie einige schöne Beispiele.

Python 3 Aktualisierung

Für Python 3 wird anstelle von iteritems() verwenden items()

0 Stimmen

Def print_all(**kwargs): for key, value in kwargs.items(): print(key+\":\"+value) **kwargs wird ein Schlüssel/Wert-Paar in einem Wörterbuch

384voto

Georg Schölly Punkte 120083

Auspacken von Wörterbüchern

** packt Wörterbücher aus.

Diese

func(a=1, b=2, c=3)

ist dasselbe wie

args = {'a': 1, 'b': 2, 'c':3}
func(**args)

Sie ist nützlich, wenn Sie Parameter konstruieren müssen:

args = {'name': person.name}
if hasattr(person, "address"):
    args["address"] = person.address
func(**args)  # either expanded to func(name=person.name) or
              #                    func(name=person.name, address=person.address)

Packen der Parameter einer Funktion

  • Utilice .items() anstelle von .iteritems() für Python 3

    def setstyle(**styles): for key, value in styles.iteritems(): # styles is a regular dictionary setattr(someobject, key, value)

Damit können Sie die Funktion wie folgt verwenden:

setstyle(color="red", bold=False)

Notas

  • kwargs ein Variablenname ist, der für Schlüsselwortargumente verwendet wird, kann ein anderer Variablenname verwendet werden. Wichtig ist, dass es sich um ein Wörterbuch handelt, das mit dem Doppelsternen-Operator entpackt wird ** .
  • Andere Iterables werden mit dem einfachen Sternchenoperator entpackt *
  • Um Verwechslungen zu vermeiden, ist es wahrscheinlich am besten, sich an die anerkannten Variablennamen zu halten, kwargs y args für Wörterbücher bzw. andere Iterabilien.

Ressourcen

74voto

Juergen Punkte 11770

Kwargs ist nur ein Wörterbuch, das zu den Parametern hinzugefügt wird.

Ein Wörterbuch kann Schlüssel-Werte-Paare enthalten. Und das sind die kwargs. Ok, so geht's.

Das Wozu ist nicht so einfach.

Zum Beispiel (sehr hypothetisch) haben Sie eine Schnittstelle, die nur andere Routinen aufruft, um die Aufgabe zu erledigen:

def myDo(what, where, why):
   if what == 'swim':
      doSwim(where, why)
   elif what == 'walk':
      doWalk(where, why)
   ...

Jetzt erhalten Sie eine neue Methode "drive":

elif what == 'drive':
   doDrive(where, why, vehicle)

Aber Moment mal, es gibt einen neuen Parameter "Fahrzeug", den Sie vorher nicht kannten. Jetzt müssen Sie ihn in die Signatur der myDo-Funktion aufnehmen.

Hier können Sie kwargs ins Spiel bringen - Sie fügen einfach kwargs zur Signatur hinzu:

def myDo(what, where, why, **kwargs):
   if what == 'drive':
      doDrive(where, why, **kwargs)
   elif what == 'swim':
      doSwim(where, why, **kwargs)

Auf diese Weise müssen Sie die Signatur Ihrer Schnittstellenfunktion nicht jedes Mal ändern, wenn sich einige der aufgerufenen Routinen ändern.

Dies ist nur ein schönes Beispiel, bei dem kwargs hilfreich sein kann.

57voto

kriss Punkte 22473

Auf der Grundlage, dass ein gutes Beispiel manchmal besser ist als ein langer Diskurs, werde ich zwei Funktionen schreiben, die alle Möglichkeiten von Python zur Übergabe von Variablenargumenten nutzen (sowohl positionale als auch benannte Argumente). Sie sollten leicht in der Lage sein, selbst zu sehen, was sie tun:

def f(a = 0, *args, **kwargs):
    print("Received by f(a, *args, **kwargs)")
    print("=> f(a=%s, args=%s, kwargs=%s" % (a, args, kwargs))
    print("Calling g(10, 11, 12, *args, d = 13, e = 14, **kwargs)")
    g(10, 11, 12, *args, d = 13, e = 14, **kwargs)

def g(f, g = 0, *args, **kwargs):
    print("Received by g(f, g = 0, *args, **kwargs)")
    print("=> g(f=%s, g=%s, args=%s, kwargs=%s)" % (f, g, args, kwargs))

print("Calling f(1, 2, 3, 4, b = 5, c = 6)")
f(1, 2, 3, 4, b = 5, c = 6)

Und hier ist das Ergebnis:

Calling f(1, 2, 3, 4, b = 5, c = 6)
Received by f(a, *args, **kwargs) 
=> f(a=1, args=(2, 3, 4), kwargs={'c': 6, 'b': 5}
Calling g(10, 11, 12, *args, d = 13, e = 14, **kwargs)
Received by g(f, g = 0, *args, **kwargs)
=> g(f=10, g=11, args=(12, 2, 3, 4), kwargs={'c': 6, 'b': 5, 'e': 14, 'd': 13})

10voto

philipp Punkte 1715

Außerdem können Sie beim Aufruf von kwargs-Funktionen auch verschiedene Verwendungsarten mischen:

def test(**kwargs):
    print kwargs['a']
    print kwargs['b']
    print kwargs['c']

args = { 'b': 2, 'c': 3}

test( a=1, **args )

ergibt diese Ausgabe:

1
2
3

Beachten Sie, dass **kwargs das letzte Argument sein muss

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X