Melewati daftar kwarg?

95

Dapatkah saya meneruskan daftar kwarg ke metode singkatnya? Inilah yang saya coba lakukan:

def method(**kwargs):
    #do something

keywords = (keyword1 = 'foo', keyword2 = 'bar')
method(keywords)
jwanga
sumber
2
Saya mencoba meneruskan kwarg dari satu fungsi ke kwarg fungsi lain. Pertanyaan bagus!
Benj

Jawaban:

160

Iya. Anda melakukannya seperti ini:

def method(**kwargs):
  print kwargs

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

Menjalankan ini dengan Python mengonfirmasi bahwa ini menghasilkan hasil yang identik:

{'keyword2': 'bar', 'keyword1': 'foo'}
{'keyword2': 'bar', 'keyword1': 'foo'}
Peter
sumber
10
Atau: kata kunci = dikt (kata kunci1 = 'foo', kata kunci2 = 'bar')
Ned Deily
1
The **Operator membongkar dapat digunakan untuk melewati kwargs dari satu fungsi ke kwargs lain fungsi ini. Pertimbangkan kode ini: (baris baru sepertinya tidak diperbolehkan dalam komentar) def a(**kw): print(kw), dan def b(**kw): a(kw). Kode ini akan menghasilkan kesalahan karena kwargs sebenarnya adalah kamus, dan akan diartikan sebagai argumen biasa dari dicttipe tersebut. Itulah sebabnya mengubah def b(**kw): a(kw)menjadi def b(**kw): a(**kw)akan membongkar kwdan menyelesaikan kesalahan.
Benj
10

Seperti yang ditunjukkan orang lain, Anda dapat melakukan apa yang Anda inginkan dengan memberikan dict. Ada berbagai cara untuk membuat dict. Salah satu yang mempertahankan keyword=valuegaya yang Anda coba adalah dengan menggunakan dict built-in:

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

Perhatikan keserbagunaan dict; semua ini menghasilkan hasil yang sama:

>>> 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
sumber
4

Apakah maksud Anda dikt? Tentu kamu bisa:

def method(**kwargs):
    #do something

keywords = {keyword1: 'foo', keyword2: 'bar'}
method(**keywords)
David Z
sumber
ah, saya tidak memperhatikan. Seharusnya lebih baik sekarang.
David Z
3

Jadi ketika saya datang ke sini saya mencari cara untuk melewatkan beberapa ** kwarg dalam satu fungsi - untuk digunakan nanti dalam fungsi selanjutnya. Karena ini, tidak mengherankan, tidak berhasil:

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

Dengan beberapa pengkodean 'eksperimental' saya sendiri sampai pada cara yang jelas bagaimana melakukannya:

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})

Ini mencetak seperti yang diharapkan:

--func1--
aaaa
bbbb
--func2--
1
2
--func3--
37
69
Clemens
sumber
6
Sampai python 3.5dengan Foo(**arg1, **arg2)kemungkinan
magu_