args と *kwargs を使うと、関数が任意の数の引数を受け取れるようになります。ラッパー関数やデコレータを書く際に必須の知識です。
*args:任意個の位置引数
*args はタプルとして位置引数を受け取ります。
def sum_all(*args): return sum(args) print(sum_all(1, 2, 3)) # 6 print(sum_all(1, 2, 3, 4, 5)) # 15
**kwargs:任意個のキーワード引数
**kwargs は辞書としてキーワード引数を受け取ります。
def print_info(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") print_info(name="Alice", age=30, city="Tokyo")
組み合わせて使う
両方を同時に使う場合、順序は「位置引数 → args → キーワード引数 → *kwargs」です。
def func(a, b, *args, option=None, **kwargs): print(f"a={a}, b={b}") print(f"args={args}") print(f"option={option}") print(f"kwargs={kwargs}") func(1, 2, 3, 4, option="test", extra="value")
呼び出し時のアンパック
リストやタプルは * で、辞書は ** でアンパックして渡せます。
def greet(name, age): print(f"{name} is {age} years old") data = {"name": "Bob", "age": 25} greet(**data) # Bob is 25 years old args = ["Alice", 30] greet(*args) # Alice is 30 years old
デコレータのラッパー関数では def wrapper(*args, **kwargs) と書くことで、どんな引数の関数にも対応できます。