結論から言うと、*args は「同じ種類の値をいくつ受け取るかわからないとき」、**kwargs は「任意の名前付き設定を受け取りたいとき」に向いています。

Pythonでは *args**kwargs が便利そうに見えるため、とりあえず使いたくなることがあります。
ただ、何でも可変長引数にすると、どんな値を渡せばよいのかが読み取りにくくなります。
この記事では、*args**kwargs を使う場面を整理しながら、通常の引数とどう使い分けるかを確認します。

この記事でわかること

  • *args**kwargs の役割の違い
  • 通常の引数で十分な場面と可変長引数が向いている場面
  • 実務で読みやすさを保ちながら使う考え方

完成コード

完成コードは次の通りです。

def calculate_total_price(*prices, tax_rate=0.1, **options):
    subtotal = sum(prices)
    if options.get("member"):
        subtotal *= 0.9

    taxed_total = int(subtotal * (1 + tax_rate))
    label = options.get("label", "合計金額")
    return f"{label}: {taxed_total}円"


print(calculate_total_price(1200, 800, 500))
print(calculate_total_price(1200, 800, 500, member=True))
print(calculate_total_price(1200, 800, tax_rate=0.08, label="お支払い額"))

コードのポイント

このコードでは、受け取る値の種類ごとに引数の役割を分けています。

  • *prices は商品価格を好きな個数だけ受け取ります
  • tax_rate=0.1 は通常の名前付き引数として標準値を持たせています
  • **options は会員割引や表示ラベルのような任意設定をまとめて受け取ります

つまり、個数が増減する値と、追加で渡したい設定を分けて扱っています。
この整理ができていると、可変長引数を使っても意図が伝わりやすくなります。

コードを順番に説明します

主要な処理を分けて説明します。

1. 個数が決まらない値は *args で受け取ります

def calculate_total_price(*prices, tax_rate=0.1, **options):
    subtotal = sum(prices)

prices は商品ごとに増えたり減ったりするため、引数の数を固定しにくいです。
このように、同じ意味の値を複数受け取りたいときは *args が向いています。

もし商品数が毎回1件か2件のように決まっているなら、通常の引数で書いたほうがわかりやすいです。
*args は便利ですが、「何個でもよいこと」に意味がある場面で使うのが基本です。

2. 任意の追加設定は **kwargs で受け取ります

    if options.get("member"):
        subtotal *= 0.9

    taxed_total = int(subtotal * (1 + tax_rate))
    label = options.get("label", "合計金額")

memberlabel は、毎回必須ではない設定です。
そのため、すべてを通常引数で並べるよりも、任意設定として受け取る形が合うことがあります。

ただし、**kwargs を多用しすぎると、どんなキーが使えるのかが関数定義から見えなくなります。
実務では、本当に任意項目として扱いたいものに絞ることが大切です。

3. 固定の意味を持つ値は通常の引数として残します

print(calculate_total_price(1200, 800, 500))
print(calculate_total_price(1200, 800, 500, member=True))
print(calculate_total_price(1200, 800, tax_rate=0.08, label="お支払い額"))

税率のように意味が明確で、多くの呼び出しで共通して使う値は、通常の引数で残したほうが読みやすいです。
tax_rate**kwargs に含めることもできますが、その場合は補完や説明が弱くなりやすいです。

そのため、必須または意味が強い設定は通常引数にし、増減しやすい値だけを *args**kwargs に寄せると設計が安定します。

実務で使うときのポイント

実務では、*args**kwargs を使うかどうかよりも、呼び出し側が迷わないかどうかが大事です。

  • *args はログ出力対象、合計対象、複数ファイルパスのように、同種の値を可変個で受け取る場面に向いています
  • **kwargs は書式設定、オプション設定、追加条件のように、任意の名前付き項目をまとめたい場面で使いやすいです
  • 必須の値まで **kwargs に入れると、どのキーが必要なのか見えにくくなります
  • ライブラリや汎用関数では便利でも、社内ツールや小規模スクリプトでは通常引数のほうが読みやすいことも多いです

特に初学者向けのコードや、あとで別の人が直す可能性があるコードでは、自由度より明確さを優先したほうが保守しやすいです。

よくある勘違い・注意点

  • *args**kwargs を使えば高度なコードになるわけではなく、通常の引数で十分ならそのほうが読みやすいです
  • **kwargs に何でも入れると、使えるキーの一覧が見えにくくなります
  • *args は順番で意味が決まるため、異なる種類の値を混ぜると扱いづらくなります
  • 可変長引数を受け取る関数は、内部でどの値を期待しているかを明確にしておかないとバグにつながりやすいです

まとめ

  • *args は同じ種類の値を可変個で受け取りたい場面に向いています
  • **kwargs は任意の名前付き設定をまとめて受け取りたい場面で使いやすいです
  • 意味が固定された重要な値は、通常の引数として残したほうが読みやすいです
  • 実務では自由度よりも、呼び出し方のわかりやすさを優先すると扱いやすくなります