Python|*argsと**kwargsの使い分けと便利な使い方

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を検討」という意識で活用してみましょう。

最後にワンポイント:
チーム開発や外部ライブラリとの連携でも、これらの構文を理解しておくとコードリーディングやデバッグが格段にラクになります!

タイトルとURLをコピーしました