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)
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)
Jawaban:
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'}
**
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 dict
tipe tersebut. Itulah sebabnya mengubah def b(**kw): a(kw)
menjadi def b(**kw): a(**kw)
akan membongkar kw
dan menyelesaikan kesalahan.
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=value
gaya 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
>>>
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
python 3.5
dengan Foo(**arg1, **arg2)
kemungkinan