結論から言うと、デフォルト引数は「よく使う標準値」を置くときに便利ですが、毎回変わる値や更新される値を直接入れるのは避けたほうが安全です。
Pythonでは、関数の引数に初期値を設定できるので、呼び出し側を短く書きやすくなります。
ただし、便利だからといって何でもデフォルト引数に入れると、意図しない動きや読みづらさにつながることがあります。
この記事では、実務で使いやすいデフォルト引数の考え方を、動くコードと一緒に整理します。
この記事でわかること
完成コード
最初に必ず動く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を受け取り、関数の中で補う形にすると、意図しない共有を防ぎやすいです- デフォルト値が多すぎる関数は、設定用のオブジェクトや別関数への分割を考えたほうが読みやすくなることがあります
実務では、あとから呼び出し箇所が増えることがよくあります。
そのため、「引数を省略したときの動きが安全か」を先に考えておくと、保守しやすくなります。