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)

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

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

4

Apakah maksud Anda dikt? Tentu kamu bisa:

def method(**kwargs):
    #do something

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

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

6
Sampai python 3.5dengan Foo(**arg1, **arg2)kemungkinan
magu_
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.