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
Một vài chi tiết bổ sung có thể hữu ích để biết (những câu hỏi tôi đã có sau khi đọc nó và đã đi và kiểm tra):
- Hàm có thể có các tham số không có trong từ điển
- Bạn không thể ghi đè một tham số đã có trong từ điển
- Từ điển không thể có các tham số không có trong hàm.
Ví dụ:
Số 1: Hàm có thể có các tham số không có trong từ điển
In[5]: mydict = {'a': 100}
In[6]: myfunc(**mydict)
100 2
Số 2: Bạn không thể ghi đè một tham số đã có trong từ điển
In[7]: mydict = {'a': 100, 'b': 200}
In[8]: myfunc(a=3, **mydict)
TypeError: myfunc() got multiple values for keyword argument 'a'
Số 3: Từ điển không thể có các tham số không có trong hàm.
In[9]: mydict = {'a': 100, 'b': 200, 'c': 300}
In[10]: myfunc(**mydict)
TypeError: myfunc() got an unexpected keyword argument 'c'
Theo yêu cầu trong các bình luận, một giải pháp cho Số 3 là lọc từ điển dựa trên các đối số từ khóa có sẵn trong hàm:
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
Một tùy chọn khác là chấp nhận (và bỏ qua) các kwarg bổ sung trong chức năng của bạn:
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
Lưu ý hơn là bạn có thể sử dụng các đối số và danh sách vị trí hoặc bộ dữ liệu theo cách hiệu quả giống như kwargs, đây là một ví dụ nâng cao hơn kết hợp cả đối số vị trí và từ khóa:
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}