はじめに
これまでの学習では、
- 計算結果を
dict(stats)にまとめる - ログ出力を関数にして再利用する
- 平均値(avg)からログレベル(OK / WARN / ERROR)を自動で決める
といった流れで、
「ログをきれいに・安全に出す仕組み」 を作ってきました。
#25 では
👉 判断(レベル決定)をコードに任せる
ことを学びました。
今回はさらに一歩進めて、
👉 ログの「見せ方」を、関数の引数で切り替える
ことをテーマに学習しました。

今回のゴール
今回の学習ゴールは以下です。
- 関数に引数を追加する
- 引数によってログの出力内容を切り替える
- 同じデータでも、用途に応じた表示ができるようにする
- #25 のログレベル自動判定と組み合わせて使う
👉 「判断」と「表示」を分けて考える
これが今回の一番大事なポイントです。
使用するデータ
今回も、これまで使ってきた stats を使用します。
stats = {
'count': 20,
'sum': 980,
'avg': 49,
'level': 'WARN' # 仮の値
}
ログレベルの自動判定(#25 の復習)
平均値 avg をもとに、ログレベルを自動で決めます。
if stats['avg'] >= 70:
stats['level'] = 'OK'
elif stats['avg'] >= 50:
stats['level'] = 'WARN'
else:
stats['level'] = 'ERROR'
この処理によって、
人が考えなくても、コードが評価を決めてくれる ようになります。
ログ出力関数を作る
ここからが #26 のメインです。
まずはログ出力を行う関数を作成します。
def log_stats(stats, mode='all'):
allowed_modes = ['all', 'avg', 'count_sum', 'summary']
message = f"[{stats['level']}]"
if mode == 'all':
message += f" count={stats['count']} sum={stats['sum']} avg={stats['avg']}"
elif mode == 'avg':
message += f" avg={stats['avg']}"
elif mode == 'count_sum':
message += f" count={stats['count']} sum={stats['sum']}"
elif mode == 'summary':
message += f" avg={stats['avg']}"
else:
message += f" unknown mode: {mode} (allowed: {', '.join(allowed_modes)})"
print(message)
引数 mode とは?
mode は、
「どの情報を表示したいか」 を指定するための引数です。
| mode | 表示内容 |
|---|---|
| all | count / sum / avg をすべて表示 |
| avg | avg だけ表示 |
| count_sum | count と sum を表示 |
| summary | 状態を把握するための要点表示 |
実行例
log_stats(stats)
log_stats(stats, mode='avg')
log_stats(stats, mode='summary')
出力例(avg = 49 の場合):
[ERROR] count=20 sum=980 avg=49
[ERROR] avg=49
[ERROR] avg=49
avg モードと summary モードについて
現在、avg と summary は 同じ表示結果 になります。
しかしこれは間違いではありません。
avg
→ 数値として avg を確認したいときsummary
→ 全体の状態をざっくり把握したいとき
👉 表示は同じでも、目的(意味)が違う
この考え方は、実務でもとても重要です。
unknown mode を用意する理由
もし存在しない mode が指定された場合でも、
log_stats(stats, mode='banana')
[ERROR] unknown mode: banana (allowed: all, avg, count_sum, summary)
と表示され、
何が間違っていて、どう直せばいいか が分かります。
👉 ログは「未来の自分」や「他人」が読むもの
👉 親切なメッセージは大きな価値になります
なぜ引数で切り替えるのか
この設計にすることで、
- 関数を増やさずに済む
- 出力形式を後から追加しやすい
- 判定ロジックと表示ロジックを分離できる
- コードの見通しが良くなる
👉 変更に強いコード になります。
今回の学び
- 関数は引数によって振る舞いを変えられる
if / elif / elseは「どれか1つを選ぶ仕組み」- 判断(level)と表示(mode)を分けると整理しやすい
- ログ設計がより実務的になった
次回に向けて
次回は、
- ログレベル判定そのものを関数にまとめる
- 複数の stats に使える形にする
などに進めそうです。


コメント