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: で受け止められます。まとめ役の関数で受け止めて、どの前提が崩れたのかを文字列で返すようにすると、原因を追いやすくなります。
要件
- 件数が 0 のときは データが1件もありません という前提崩れにする
- 金額がマイナスの支出があるときは 品名 の金額がマイナスです という前提崩れにする
- 前提が崩れたら 検査に失敗しました メッセージ を返す
- すべて通ったら 検査を通りました 件数 件 を返す
入出力例
check_expenses([["ノート",250],["牛乳",180]]) → "検査を通りました 2 件"
check_expenses([["ノート",250],["返金",-80]]) → "検査に失敗しました 返金 の金額がマイナスです"
check_expenses([]) → "検査に失敗しました データが1件もありません"ヒント
編集 LuaGate編集部