1. はじめに
Pythonで関数を定義する際、「*args
」や「**kwargs
」という記法を見かけたことはありませんか?
これらは、可変長の引数を受け取るための便利な方法で、柔軟な関数の作成に役立ちます。
本記事では、「Python|*argsと**kwargsの使い分けと便利な使い方」というテーマで、基本的な使い方から実務に役立つ応用例まで、わかりやすく解説します。
2. *argsと**kwargsの基本的な使い方【Python構文解説】
*argsとは
*args
は、関数に渡される位置引数(positional arguments)をタプルとして受け取る構文です。引数の数が事前に決まっていない場合に使います。
def print_numbers(*args):
for num in args:
print(num)
print_numbers(1, 2, 3, 4)
実行結果:
1
2
3
4
**kwargsとは
**kwargs
は、関数に渡されるキーワード引数(keyword arguments)を辞書として受け取る構文です。キーと値のペアが可変のときに便利です。
def print_profile(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_profile(name="Alice", age=30, city="Tokyo")
実行結果:
name: Alice
age: 30
city: Tokyo
3. よくある使い方・応用例
位置引数とキーワード引数を同時に受け取る
*args
と**kwargs
は、同じ関数内で同時に使うこともできます。順番に注意すれば、非常に柔軟な関数を作れます。
def demo_function(*args, **kwargs):
print("位置引数:")
for arg in args:
print(arg)
print("キーワード引数:")
for key, value in kwargs.items():
print(f"{key}: {value}")
demo_function(10, 20, name="Taro", age=25)
実行結果:
位置引数:
10
20
キーワード引数:
name: Taro
age: 25
辞書やリストを展開して渡す(アンパック)
引数を渡すときに「*
」や「**
」を使って展開(アンパック)することも可能です。
def show_data(a, b, c):
print(a, b, c)
values = [1, 2, 3]
show_data(*values)
data = {"a": "X", "b": "Y", "c": "Z"}
show_data(**data)
実行結果:
1 2 3
X Y Z
実務で便利なケース:ロギングや設定値の受け渡し
例えば、ログ関数や設定を柔軟に処理する関数では、**kwargs
が非常に役立ちます。
def log_event(event_name, **kwargs):
print(f"[{event_name}]")
for key, value in kwargs.items():
print(f" {key}: {value}")
log_event("UserLogin", user="admin", ip="192.168.1.1", status="success")
実行結果:
[UserLogin]
user: admin
ip: 192.168.1.1
status: success
4. *argsと**kwargsの注意点とエラー対策
順番に注意!args → kwargs の順に書く
関数定義での順序は決まっています。順番を間違えるとエラーになります。
# 正しい順番
def sample(a, b=0, *args, **kwargs):
pass
# 間違った順番(SyntaxError)
# def sample(*args, b=0, **kwargs): ← NG
アンパック時の型に注意
*args
や**kwargs
で渡すオブジェクトの型が不適切だと、TypeErrorが発生します。*
でリスト、**
で辞書を渡すのが原則です。
予期しない引数に対する防御
関数を使う側が誤って余分な引数を渡すケースもあるため、**kwargs
を用意しておけばエラー防止になります。
5. まとめ
*args
は「複数の位置引数」をまとめて受け取れる**kwargs
は「複数のキーワード引数」を辞書として受け取れる- 同時使用すれば柔軟性が高まり、再利用性の高い関数が作れる
実務でのログ処理や柔軟なAPIの作成にも役立つ構文です。
初めて見るとややこしく感じますが、仕組みを理解すればシンプルです。
「引数を柔軟に扱いたいときは、まず*args
と**kwargs
を検討」という意識で活用してみましょう。
最後にワンポイント:
チーム開発や外部ライブラリとの連携でも、これらの構文を理解しておくとコードリーディングやデバッグが格段にラクになります!