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)
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)
Antworten:
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'}
**
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 dict
Typs interpretiert wird . Aus diesem Grund werden die Fehler durch Ändern def b(**kw): a(kw)
von def b(**kw): a(**kw)
entpackt kw
und behoben.
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=value
Ihnen 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
>>>
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
python 3.5
dem Foo(**arg1, **arg2)
ist möglich