In[1]: def myfunc(a=1, b=2):
In[2]: print(a, b)
In[3]: mydict = {'a': 100, 'b': 200}
In[4]: myfunc(**mydict)
100 200
Beberapa detail tambahan yang mungkin berguna untuk diketahui (pertanyaan yang saya miliki setelah membaca ini dan pergi dan menguji):
- Fungsi dapat memiliki parameter yang tidak termasuk dalam kamus
- Anda tidak dapat mengganti parameter yang sudah ada di kamus
- Kamus tidak dapat memiliki parameter yang tidak ada dalam fungsi.
Contoh:
Nomor 1: Fungsi ini dapat memiliki parameter yang tidak termasuk dalam kamus
In[5]: mydict = {'a': 100}
In[6]: myfunc(**mydict)
100 2
Nomor 2: Anda tidak dapat mengganti parameter yang sudah ada dalam kamus
In[7]: mydict = {'a': 100, 'b': 200}
In[8]: myfunc(a=3, **mydict)
TypeError: myfunc() got multiple values for keyword argument 'a'
Nomor 3: Kamus tidak dapat memiliki parameter yang tidak ada dalam fungsi.
In[9]: mydict = {'a': 100, 'b': 200, 'c': 300}
In[10]: myfunc(**mydict)
TypeError: myfunc() got an unexpected keyword argument 'c'
Seperti yang diminta dalam komentar, solusi untuk Nomor 3 adalah menyaring kamus berdasarkan argumen kata kunci yang tersedia di fungsi:
In[11]: import inspect
In[12]: mydict = {'a': 100, 'b': 200, 'c': 300}
In[13]: filtered_mydict = {k: v for k, v in mydict.items() if k in [p.name for p in inspect.signature(myfunc).parameters.values()]}
In[14]: myfunc(**filtered_mydict)
100 200
Opsi lain adalah menerima (dan mengabaikan) kwarg tambahan di fungsi Anda:
In[15]: def myfunc2(a=None, **kwargs):
In[16]: print(a)
In[17]: mydict = {'a': 100, 'b': 200, 'c': 300}
In[18]: myfunc2(**mydict)
100
Perhatikan lebih jauh daripada Anda dapat menggunakan argumen dan daftar posisi atau tuple secara efektif dengan cara yang sama seperti kwargs, berikut adalah contoh yang lebih maju yang menggabungkan argumen posisi dan kata kunci:
In[19]: def myfunc3(a, *posargs, b=2, **kwargs):
In[20]: print(a, b)
In[21]: print(posargs)
In[22]: print(kwargs)
In[23]: mylist = [10, 20, 30]
In[24]: mydict = {'b': 200, 'c': 300}
In[25]: myfunc3(*mylist, **mydict)
10 200
(20, 30)
{'c': 300}