assertで前提を守る

このレッスンでできるようになること。assert で「ここまで来たら必ず成り立っているはず」の前提を書き、集計前に家計簿のデータが壊れていないか検査できるようになります。

assert 条件, "メッセージ" と書くと、条件が偽のときに AssertionError が起こります。条件が真なら何も起きません。

expenses = [["ノート", 250], ["牛乳", 180]] assert len(expenses) > 0, "データが1件もありません"

raise との違いは向いている相手です。raise は利用者の入力ミスのように「起こりうる異常」を伝えるためのもの、assert は「起きたらプログラムの作りが間違っている」前提の確認です。集計関数に空のリストや負の金額が届いたなら、それは呼び出し側のバグですから assert が向いています。

もう一つ大事な性質があります。assert は Python を最適化モードで動かすと丸ごと無視されます。ですから利用者の入力検証を assert だけに頼ってはいけません。入力検証は raise、内部の前提確認は assert と覚えます。

AssertionError も例外なので、except AssertionError as e: で受け止められます。まとめ役の関数で受け止めて、どの前提が崩れたのかを文字列で返すようにすると、原因を追いやすくなります。

要件

  1. 件数が 0 のときは データが1件もありません という前提崩れにする
  2. 金額がマイナスの支出があるときは 品名 の金額がマイナスです という前提崩れにする
  3. 前提が崩れたら 検査に失敗しました メッセージ を返す
  4. すべて通ったら 検査を通りました 件数 件 を返す

入出力例

check_expenses([["ノート",250],["牛乳",180]])"検査を通りました 2 件" check_expenses([["ノート",250],["返金",-80]])"検査に失敗しました 返金 の金額がマイナスです" check_expenses([])"検査に失敗しました データが1件もありません"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.py
学習モード

メモ

assertで前提を守る

⌘S で保存