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 .

7voto

naught101 Punkte 17337

Hier ist eine einfache Funktion, mit der die Verwendung erklärt wird:

def print_wrap(arg1, *args, **kwargs):
    print(arg1)
    print(args)
    print(kwargs)
    print(arg1, *args, **kwargs)

Alle Argumente, die nicht die in der Funktionsdefinition angegeben sind, werden in den args Liste, oder die kwargs Liste, je nachdem, ob es sich um Schlüsselwortargumente handelt oder nicht:

>>> print_wrap('one', 'two', 'three', end='blah', sep='--')
one
('two', 'three')
{'end': 'blah', 'sep': '--'}
one--two--threeblah

Wenn Sie ein Schlüsselwortargument hinzufügen, das nie an eine Funktion übergeben wird, wird ein Fehler ausgelöst:

>>> print_wrap('blah', dead_arg='anything')
TypeError: 'dead_arg' is an invalid keyword argument for this function

4voto

Kwargs sind ein syntaktischer Zucker, um Namensargumente als Wörterbücher (für func) oder Wörterbücher als benannte Argumente (an func) zu übergeben

2voto

Jeff Silverman Punkte 644

Hier ist ein Beispiel, das hoffentlich hilfreich ist:

#! /usr/bin/env python
#
def g( **kwargs) :
  print ( "In g ready to print kwargs" )
  print kwargs
  print ( "in g, calling f")
  f ( **kwargs )
  print ( "In g, after returning from f")

def f( **kwargs ) :
  print ( "in f, printing kwargs")
  print ( kwargs )
  print ( "In f, after printing kwargs")

g( a="red", b=5, c="Nassau")

g( q="purple", w="W", c="Charlie", d=[4, 3, 6] )

Wenn Sie das Programm ausführen, erhalten Sie:

$ python kwargs_demo.py 
In g ready to print kwargs
{'a': 'red', 'c': 'Nassau', 'b': 5}
in g, calling f
in f, printing kwargs
{'a': 'red', 'c': 'Nassau', 'b': 5}
In f, after printing kwargs
In g, after returning from f
In g ready to print kwargs
{'q': 'purple', 'c': 'Charlie', 'd': [4, 3, 6], 'w': 'W'}
in g, calling f
in f, printing kwargs
{'q': 'purple', 'c': 'Charlie', 'd': [4, 3, 6], 'w': 'W'}
In f, after printing kwargs
In g, after returning from f

Das Wichtigste dabei ist, dass die variable Anzahl von benannten Argumenten im Aufruf in ein Wörterbuch in der Funktion übersetzt wird.

1voto

Tiago Martins Peres Punkte 12271

Schlüsselwort-Argumente werden oft abgekürzt zu kwargs in Python. Unter Computerprogrammierung ,

Schlüsselwortargumente beziehen sich auf die Unterstützung von Funktionen durch eine Computersprache Funktionsaufrufe, bei denen die Namen der einzelnen Parameter innerhalb des Funktionsaufrufs.

Die Verwendung von zwei Sternchen vor dem Parameternamen, **kwargs ist, wenn man nicht weiß, wie viele Schlüsselwortargumente an die Funktion übergeben werden. In diesem Fall spricht man von willkürlichen / Platzhalter-Schlüsselwortargumenten.

Ein Beispiel hierfür ist Djangos Empfängerfunktionen .

def my_callback(sender, **kwargs):
    print("Request finished!")

Beachten Sie, dass die Funktion ein Absenderargument zusammen mit einem Platzhalter benötigt Schlüsselwortargumenten (**kwargs); alle Signalhandler müssen diese Argumente übernehmen. Alle Signale senden Schlüsselwortargumente und können diese ändern Schlüsselwortargumente jederzeit ändern. Im Fall von anfrage_erledigt ist es dokumentiert, dass es keine Argumente sendet, was bedeutet, dass wir versucht sein könnten, unsere unsere Signalbehandlung als my_callback(sender) zu schreiben.

Das wäre falsch - tatsächlich wird Django einen Fehler ausgeben, wenn Sie dies tun. Das liegt daran, dass zu jedem Zeitpunkt Argumente zum Signal hinzugefügt werden und der Empfänger muss in der Lage sein, diese neuen Argumente zu verarbeiten.

Beachten Sie, dass die Funktion nicht aufgerufen werden muss kwargs aber er muss ** haben (der Name kwargs ist eine Konvention).

0voto

Dies ist ein einfaches Beispiel zum Verständnis von python entpacken ,

>>> def f(*args, **kwargs):
...    print 'args', args, 'kwargs', kwargs

eg1:

>>>f(1, 2)
>>> args (1,2) kwargs {} #args return parameter without reference as a tuple
>>>f(a = 1, b = 2)
>>> args () kwargs {'a': 1, 'b': 2} #args is empty tuple and kwargs return parameter with reference as a dictionary

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