*args / **kwargs: 可変長引数

引数の数が不定な関数を作る。デコレータの必須知識。

*args
可変長の位置引数(タプル)。
**kwargs
可変長のキーワード引数(辞書)。
アンパック
*list や **dict で展開。

*args / **kwargs

ピザの注文 (Pizza Order)

関数の引数はピザの注文に似ています。「Mサイズ(必須)」のような決まった引数の他に、`*args`(トッピング全部)や `**kwargs`(配達オプション全部)を使って、好きなだけ情報を渡せます。「サラミとピーマン(*args)」を追加し、「時間指定=19:00(**kwargs)」を指定するイメージです。

`*args` は余った位置引数を「タプル」として受け取り、`**kwargs` は余ったキーワード引数を「辞書」として受け取ります。これを使えば、引数の数が決まっていない柔軟な関数や、他の関数へ引数をそのまま中継するラッパー関数を作れます。

Variable Arguments
# *args: 可変長の位置引数
def greet(*names):
for name in names:
print(f"Hello, {name}!")
greet("Alice", "Bob", "Carol")
# **kwargs: 可変長のキーワード引数
def build_profile(**info):
return info
profile = build_profile(name="Alice", age=30, city="Tokyo")
# {'name': 'Alice', 'age': 30, 'city': 'Tokyo'}
# 両方組み合わせ
def func(a, b, *args, **kwargs):
print(a, b) # 必須引数
print(args) # タプル
print(kwargs) # 辞書
Bad
# ❌ Bad: 引数を個別に列挙
def create_user(name, age, email, city, phone):
pass
Good
# ✅ Good: **kwargs で柔軟に
def create_user(name, **details):
pass

パターン

Unpack, Decorator
# アンパック呼び出し
def add(a, b, c):
return a + b + c
nums = [1, 2, 3]
add(*nums) # 6
config = {'a': 1, 'b': 2, 'c': 3}
add(**config) # 6
# デコレータで活用
def log_calls(func):
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__}")
return func(*args, **kwargs)
return wrapper
@log_calls
def calculate(x, y):
return x + y
# キーワード専用引数(* の後)
def func(a, b, *, required_kwarg):
pass
# func(1, 2, required_kwarg=3) # OK
# func(1, 2, 3) # Error!
Tip: デコレータは *args, **kwargs で元の関数の引数を透過的に渡す。

合格ライン

*args と **kwargs を使える
呼び出し時のアンパックができる

演習課題

課題1: *args
任意の数の引数を受け取る関数を作成してください。
課題2: **kwargs
キーワード引数を辞書として受け取る関数を作成してください。