結論から言うと、*args は「同じ種類の値をいくつ受け取るかわからないとき」、**kwargs は「任意の名前付き設定を受け取りたいとき」に向いています。
Pythonでは *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", "合計金額")member や label は、毎回必須ではない設定です。
そのため、すべてを通常引数で並べるよりも、任意設定として受け取る形が合うことがあります。
ただし、**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に入れると、どのキーが必要なのか見えにくくなります - ライブラリや汎用関数では便利でも、社内ツールや小規模スクリプトでは通常引数のほうが読みやすいことも多いです
特に初学者向けのコードや、あとで別の人が直す可能性があるコードでは、自由度より明確さを優先したほうが保守しやすいです。