結論から言うと、デフォルト引数は「よく使う標準値」を置くときに便利ですが、毎回変わる値や更新される値を直接入れるのは避けたほうが安全です。

Pythonでは、関数の引数に初期値を設定できるので、呼び出し側を短く書きやすくなります。
ただし、便利だからといって何でもデフォルト引数に入れると、意図しない動きや読みづらさにつながることがあります。
この記事では、実務で使いやすいデフォルト引数の考え方を、動くコードと一緒に整理します。

この記事でわかること

  • デフォルト引数を使うと読みやすくなる場面
  • 実務で避けたほうがよいデフォルト引数の例
  • None を使って安全に初期値を扱う方法

完成コード

最初に必ず動くPythonコードを1つ示します。

def build_backup_path(filename, directory="backup", extension="txt"):
    return f"{directory}/{filename}.{extension}"


def normalize_tags(tags=None):
    if tags is None:
        tags = []

    normalized = []
    for tag in tags:
        cleaned = tag.strip().lower()
        if cleaned:
            normalized.append(cleaned)
    return normalized


print(build_backup_path("report"))
print(build_backup_path("report", extension="csv"))
print(normalize_tags([" Python ", " 自動化 ", ""]))
print(normalize_tags())

コードのポイント

このコードでは、デフォルト引数を2つの考え方で使い分けています。

  • build_backup_path() は、よく使う標準値をそのまま引数に置いています
  • normalize_tags() は、リストのような更新される値を直接置かず、None を入口にしています

つまり、固定して問題ない値はそのまま書き、毎回新しく用意したい値は関数の中で作る、という分け方です。

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

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

1. 標準値が自然に決まるものはデフォルト引数に向いています

def build_backup_path(filename, directory="backup", extension="txt"):
    return f"{directory}/{filename}.{extension}"

この関数では、保存先ディレクトリと拡張子に標準値を持たせています。
多くの呼び出しで同じ値を使うなら、毎回指定しなくてよくなるのでコードがすっきりします。

このように、文字列や数値、真偽値のような固定値は、デフォルト引数と相性がよいです。
呼び出す側から見ても、「省略したら何になるか」がすぐ伝わります。

2. リストや辞書は None を入口にして安全に扱います

def normalize_tags(tags=None):
    if tags is None:
        tags = []

リストや辞書のような変更可能な値を、そのままデフォルト引数に書くのは避けたほうが安全です。
Pythonではデフォルト引数が関数定義時に評価されるため、意図せず値が共有されることがあるからです。

そのため、実務では None を初期値にして、必要なときに関数の中で新しいリストや辞書を作る書き方がよく使われます。
この形なら、呼び出しごとに独立した値を扱えます。

3. 呼び出し側を短くしつつ、必要なら上書きできる形にします

print(build_backup_path("report"))
print(build_backup_path("report", extension="csv"))
print(normalize_tags([" Python ", " 自動化 ", ""]))
print(normalize_tags())

デフォルト引数のよさは、よくある呼び出しを短く書けることです。
一方で、必要なときだけ上書きできるので、柔軟さも残せます。

ただし、引数が多すぎる関数でデフォルト引数を増やしすぎると、何を省略してよいのかがわかりにくくなります。
標準値が自然に想像できる項目だけに絞ると、実務でも扱いやすいです。

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

デフォルト引数は、設定ファイルの既定値、保存先フォルダ、ログ出力のON/OFFのように、多くの場面で共通する値に向いています。

  • 省略時の挙動が読んだだけでわかる値を置くと、呼び出し側の負担を減らせます
  • リスト、辞書、datetime.now() のような毎回変わる値は、そのままデフォルト引数にしないほうが安全です
  • None を受け取り、関数の中で補う形にすると、意図しない共有を防ぎやすいです
  • デフォルト値が多すぎる関数は、設定用のオブジェクトや別関数への分割を考えたほうが読みやすくなることがあります

実務では、あとから呼び出し箇所が増えることがよくあります。
そのため、「引数を省略したときの動きが安全か」を先に考えておくと、保守しやすくなります。

よくある勘違い・注意点

  • リストや辞書をデフォルト引数に直接書くと、値が呼び出し間で共有されることがあります
  • 省略時の意味がわかりにくい値を置くと、呼び出し側で意図を読み取りにくくなります
  • デフォルト引数が多すぎると、関数の責務が広がりすぎている可能性があります
  • 「とりあえず None」ではなく、None のときにどう補うかを関数内で明確にする必要があります

まとめ

  • デフォルト引数は、よく使う標準値を置くときに便利です
  • 固定値はそのまま書きやすく、変更可能な値は None を入口にすると安全です
  • 省略時の動きが自然に想像できるかどうかが、実務での使い分けの目安になります
  • 引数が増えすぎる場合は、関数設計そのものを見直すことも大切です

次の記事