Pythonファイル・エラー・制作のよくある間違い

レッスンの本文で注意している点を、つまずきの側から30件ぶん並べ直しました。書いた覚えのある形が見つかったら、 そのままレッスンに戻って前後を読めます。

ファイルを読み込む

レッスンを読む

close を書き忘れる

開いたまま放置するとファイルが解放されず、書き込んだ内容が反映されないことがあります。次のレッスンで学ぶ with を使えばこの問題は消えます。

ファイルを読み込むで詳しく読む

戻り値が文字列のまま

read の結果をそのまま return すると、行のリストではなく 1 本の文字列が返ります。splitlines を通してからにします。

ファイルを読み込むで詳しく読む

ファイルに書き込む

レッスンを読む

withで安全に扱う

レッスンを読む

コロンとインデントを忘れる

with open(path, "w") as f の行末にはコロンが必要で、次の行はインデントします。忘れると SyntaxError になります。

withで安全に扱うで詳しく読む

ブロックの外で f を使う

ブロックを抜けたあとに f.read() を呼ぶと ValueError になります。閉じたファイルは読めません。

withで安全に扱うで詳しく読む

CSV形式で保存

レッスンを読む

str を付け忘れる

",".join([name, price, category]) のように int を混ぜると TypeError になります。エラーメッセージは sequence item 1 と、何番目が悪いかを教えてくれます。

CSV形式で保存で詳しく読む

区切り文字を混同する

項目の区切りは ","、行の区切りは "\n" です。両方 join で書くので取り違えやすい部分です。

CSV形式で保存で詳しく読む

品名にカンマが入る

"りんご, みかんセット" のようにカンマを含む品名を保存すると、読み戻したときに項目数が合わなくなります。このコースでは品名にカンマを使わない前提にしますが、実務では標準ライブラリの csv を使ってこの問題を避けます。

CSV形式で保存で詳しく読む

try-exceptで備える

レッスンを読む

except の範囲を広げすぎる

except: とだけ書くと、あらゆる例外を飲み込んでしまいます。本当のバグまで隠れて原因が追えなくなるので、受け止める種類は必ず書きます。

try-exceptで備えるで詳しく読む

try の範囲を広げすぎる

try のブロックに関係ない処理まで入れると、どこで失敗したのか分からなくなります。危ない 1 行だけを囲むのが基本です。

try-exceptで備えるで詳しく読む

except で何もしない

except ValueError: pass と書くと、失敗を無視して先に進みます。今回は 0 を返すという後始末があるので、pass は使いません。

try-exceptで備えるで詳しく読む

例外の種類

レッスンを読む

except の種類を間違える

except ValueError では FileNotFoundError を受け止められません。関係のない種類を書くと、例外はそのまま素通りして止まります。

例外の種類で詳しく読む

trywith を入れ忘れる

with の外側だけ try で囲んでも意味がありません。open が呼ばれる場所が try の中に入っている必要があります。

例外の種類で詳しく読む

None の判定に == を使う

initial_text is not None と書きます。空文字も「渡された」として扱いたいので、if initial_text: では空文字が省略扱いになってしまいます。

例外の種類で詳しく読む

つくる:保存機能

レッスンを読む

int に戻し忘れる

金額が "120" のまま返ると、見た目は似ていてもテストは落ちます。辞書に入れる前に int(price) を通します。

つくる:保存機能で詳しく読む

キーの順番や名前を変える

保存の形式は namepricecategory の順です。読み戻すときも同じ順で受け取ります。キー名は第 7 章から一貫して英語です。

つくる:保存機能で詳しく読む

書き込みのあと読まずに records を返す

テストは通ってしまうかもしれませんが、保存できたことの確認になりません。必ずファイル経由で戻します。

つくる:保存機能で詳しく読む

全機能を統合しよう

レッスンを読む

command[0] 以外を先に取り出してしまう

["summary"] は要素が 1 つしかないので、いきなり command[1] を読むと IndexError になります。操作名で分岐したあと、その枝の中で取り出します。

全機能を統合しようで詳しく読む

月間レポート機能

レッスンを読む

remaining を合計の途中で計算する

ループの中で引くと、最後の記録を足す前の値が残ります。引き算はループを抜けたあとです。

月間レポート機能で詳しく読む

予算オーバーを 0 で止める

使いすぎたときの remaining は負の数のままにします。-500 と出るからこそ、いくら超えたのかが分かります。

月間レポート機能で詳しく読む

in の向きを逆にする

record["name"] in keyword と書くと、品名がキーワードに含まれるかという逆の判定になります。ほとんどの場合ずっと偽になります。

自由拡張で詳しく読む

見つからないときに None を返す

呼び出し側が for で回した瞬間に TypeError になります。空のリストを返します。

自由拡張で詳しく読む

元のリストから消しながら探す

remove で絞り込もうとすると、元の記録が壊れます。新しいリストに集めるのが安全です。

自由拡張で詳しく読む