我們常常在看開源專案時, 會在函式中看到「*args」與「**kwargs」這兩個參數, 一直以來都很好奇也尚未使用, 趁著好奇心強烈的時期趕緊來了解一番, 並且將學習過程轉化為易懂的概念提供給有需要的朋友參考, 也期望我們能夠共同學習程式語言, 讓科技引領世界進步。
會將參數以 tuple的形式帶入, 有什麼好處? 舉例來說, 我們設計一個加法函數如下:
def add(a: int, b: int) -> int:
return a + b
假設我們要對3個值相加, 那麼可能會這樣做:
def add(a: int, b: int, c: int) -> int:
return a + b + c
🤔 那如果更多呢?? 是不是非常的冗長呢?
那既然我們的加法器非常的彈性, 可以對很多數字加總, 那麼我們就可以善用*args將參數都轉化成tuple形式, 再用一個迴圈進行加總即可。
from typing import Tuple
def add(*args: Tuple[int, ...]) -> int:
return sum(args)
print(add(1,2,3))
我們學會了 *args的用法, 雖然很彈性沒錯, 但假設我們需要具名的參數呢? 所謂的具名的參數就是我們可以給定一個可識別的名稱, 那可以怎麼做呢? 我們可以運用 **kwargs的技巧將參數轉成字典型態。
from typing import Dict
def func(**kwargs: Dict[any, any]):
print(kwargs)
func(a='a', b='b', custom='客製化參數')
# {'a': 'a', 'b': 'b', 'custom': '客製化參數'}
簡單來說就是將使用者的參數轉換成Dict字典型態。
可以, 但有以下限制:
🚫 *args 一定要在 **kwargs 前面, 否則會報錯!
我們應該要這麼放:
from typing import Dict, Tuple
def func(*args: Tuple[any, ...], **kwargs: Dict[any, any]):
print(args)
print(kwargs)
func(1, 2, 3 , a='a', b='b', custom='客製化參數')
預計得到這樣的結果:
(1, 2, 3)
{'a': 'a', 'b': 'b', 'custom': '客製化參數'}
看了幾個開源專案發現了這些用法, 一開始還真的有點不容易理解, 但相信這樣的設計一定是能夠滿足某些使用情境, 因此才會被發展出來, 我們只需要知道怎麼用就可以了, 等到情境剛好遇到的那一天就能夠派上用場。
總之最終目的就是讓函式更加彈性靈活, 尤其在我們尚未確定完整的函數參數狀況之下。