Eine Liste von Kwargs übergeben?

95

Kann ich der Kürze halber eine Liste von Wargen an eine Methode übergeben? Das versuche ich zu tun:

def method(**kwargs):
    #do something

keywords = (keyword1 = 'foo', keyword2 = 'bar')
method(keywords)
jwanga
quelle
2
Ich habe versucht, kwargs von einer Funktion an die kwargs einer anderen Funktion zu übergeben. Gute Frage!
Benj

Antworten:

160

Ja. Du machst es so:

def method(**kwargs):
  print kwargs

keywords = {'keyword1': 'foo', 'keyword2': 'bar'}
method(keyword1='foo', keyword2='bar')
method(**keywords)

Wenn Sie dies in Python ausführen, wird bestätigt, dass diese zu identischen Ergebnissen führen:

{'keyword2': 'bar', 'keyword1': 'foo'}
{'keyword2': 'bar', 'keyword1': 'foo'}
Peter
quelle
10
Oder: keywords = dict (keyword1 = 'foo', keyword2 = 'bar')
Ned Deily
1
Der **Entpackungsoperator kann verwendet werden, um kwargs von einer Funktion an die kwargs einer anderen Funktion zu übergeben. Betrachten Sie diesen Code: (Zeilenumbrüche scheinen in Kommentaren nicht zulässig zu sein) def a(**kw): print(kw)und def b(**kw): a(kw). Dieser Code generiert einen Fehler, da kwargs eigentlich ein Wörterbuch ist und als reguläres Argument des dictTyps interpretiert wird . Aus diesem Grund werden die Fehler durch Ändern def b(**kw): a(kw)von def b(**kw): a(**kw)entpackt kwund behoben.
Benj
10

Wie andere bereits betont haben, können Sie tun, was Sie wollen, indem Sie ein Diktat verabschieden. Es gibt verschiedene Möglichkeiten, ein Diktat zu erstellen. Einer, der den von keyword=valueIhnen versuchten Stil beibehält, ist die Verwendung des integrierten Diktats :

keywords = dict(keyword1 = 'foo', keyword2 = 'bar')

Beachten Sie die Vielseitigkeit von dict; Alle diese Ergebnisse führen zu demselben Ergebnis:

>>> kw1 = dict(keyword1 = 'foo', keyword2 = 'bar')
>>> kw2 = dict({'keyword1':'foo', 'keyword2':'bar'})
>>> kw3 = dict([['keyword1', 'foo'], ['keyword2', 'bar']])
>>> kw4 = dict(zip(('keyword1', 'keyword2'), ('foo', 'bar')))
>>> assert kw1 == kw2 == kw3 == kw4
>>> 
Ned Deily
quelle
4

Meinst du ein Diktat? Sicher kannst du:

def method(**kwargs):
    #do something

keywords = {keyword1: 'foo', keyword2: 'bar'}
method(**keywords)
David Z.
quelle
Ah, ich habe nicht aufgepasst. Sollte jetzt besser sein.
David Z
3

Als ich hierher kam, suchte ich nach einer Möglichkeit, mehrere ** kwargs in einer Funktion zu übergeben - für die spätere Verwendung in weiteren Funktionen. Weil dies nicht so überraschend nicht funktioniert:

def func1(**f2_x, **f3_x):
     ...

Mit einer eigenen 'experimentellen' Codierung bin ich auf die offensichtliche Art und Weise gekommen, wie es geht:

def func3(f3_a, f3_b):
    print "--func3--"
    print f3_a
    print f3_b
def func2(f2_a, f2_b):
    print "--func2--"
    print f2_a
    print f2_b

def func1(f1_a, f1_b, f2_x={},f3_x={}):
    print "--func1--"
    print f1_a
    print f1_b
    func2(**f2_x)
    func3(**f3_x)

func1('aaaa', 'bbbb', {'f2_a':1, 'f2_b':2}, {'f3_a':37, 'f3_b':69})

Dies wird wie erwartet gedruckt:

--func1--
aaaa
bbbb
--func2--
1
2
--func3--
37
69
Clemens
quelle
6
Ab python 3.5dem Foo(**arg1, **arg2)ist möglich
magu_