🟩 Python学習記録#26|ログ出力を関数の引数で切り替える

Code

はじめに

これまでの学習では、

  • 計算結果を 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表示内容
allcount / sum / avg をすべて表示
avgavg だけ表示
count_sumcount と 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 モードについて

現在、avgsummary同じ表示結果 になります。

しかしこれは間違いではありません。

  • 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 に使える形にする

などに進めそうです。

コメント

タイトルとURLをコピーしました