エラーを読んでみる

このレッスンで作るもの — エラーメッセージの読み方を覚え、壊れたコードを自力で直せるようにします。

エラーを読んでみる

プログラムは書けばだいたい失敗します。エラーは「あなたが下手だ」という宣告ではなく、Python が親切に出してくれた どこで何が起きたかの報告書 です。読み方さえ分かれば、いちばん頼りになる味方になります。

エラーは一気に読もうとせず、下記の 3 か所だけ拾えば十分です。

  1. いちばん下の行の エラー名
  2. その右にある メッセージ
  3. 上のほうにある line に続く 行番号

SyntaxError は文法の壊れ

SyntaxError は「文として読めない」という意味です。日本語で言えば助詞が抜けているような状態で、Python は実行を始めることすらできません。

def safe_total(price1, price2) return price1 + price2

これを動かすと SyntaxError が出ます。1 行目の末尾にコロンが無いのが原因です。def の行は最後に必ずコロンを付ける決まりになっています。

SyntaxError でよくある原因は、閉じ忘れたクオート、閉じ忘れたかっこ、そして全角で入力してしまった記号の 3 つです。

SyntaxError の行番号は、本当の原因より 1 行あと を指すことがよくあります。閉じかっこが足りないと、Python は次の行まで読んでから初めて「おかしい」と気づくためです。指摘された行で見つからなければ、必ず 1 つ上の行も見てください。

NameError は名前の間違い

NameError は「その名前は知りません」という意味です。打ち間違いか、まだ用意していない名前を使ったときに出ます。

def safe_total(price1, price2, price3): return price1 + price2 + price4

price4 という引数はどこにも無いので、NameError が出ます。メッセージは name 'price4' is not defined のような形で、知らない名前そのもの を教えてくれます。

SyntaxError と違い、NameError は実行がその行に 届いたとき に出ます。つまり通らない行に間違いがあると、しばらく気づけません。

diagram (will load when visible)

メッセージを実際に読む

NameError が出たときの表示は、おおよそ下記の形です。

Traceback (most recent call last) File "main.py", line 2, in safe_total return price1 + price2 + price4 NameError: name 'price4' is not defined

いちばん下に NameError、その右に name 'price4' is not defined、上のほうに line 2 があります。この 3 つで「2 行目の price4 という名前が存在しない」と読めます。あとは price4price3 に直すだけです。

英語だからと画面を閉じてしまうのが、いちばんもったいない対応です。is not defined は「定義されていない」、invalid syntax は「文法が不正」と、出てくる表現はほんの数種類しかありません。

直す手順を決めておく

エラーが出たときの手順をあらかじめ決めておくと、慌てずに済みます。おすすめは下記の 4 ステップです。

  1. いちばん下のエラー名を見て、文法の問題か名前の問題かを切り分ける
  2. 行番号の行を開き、その 1 つ上の行もあわせて眺める
  3. メッセージが名前や記号を名指ししていれば、それをそのまま探す
  4. 1 か所だけ直して、もう一度実行する

大事なのは 4 番目です。あちこち同時に直すと、どの変更が効いたのか分からなくなります。1 回に 1 か所だけ直して走らせる、を繰り返すのが結局いちばん速い直し方です。

エラーが出るのは、Python がきちんと仕事をしている証拠です。むしろ怖いのは、エラーが出ないのに答えが間違っている状態です。エラーを歓迎できるようになると、学習の速度が一段上がります。

よくある間違い

  1. エラーの一番上だけ読む — 上のほうは Python の内部の呼び出し履歴で、原因は いちばん下 に書いてあります。下から読むのが鉄則です。
  2. 行番号を信じすぎるSyntaxError は原因の 1 行あとを指すことがあります。指摘された行に問題が無ければ、上の行を疑います。
  3. エラーを消すために処理を消す — 動かない行をまるごと削ればエラーは消えますが、必要な処理まで消えます。直すのであって、消すのではありません。

やってみよう

関数 safe_total を実装してください。引数は price1price2price3 の 3 つで、3 件の合計を数値で return します。

用意されている starter_code はわざと壊してあります。実行すると NameError が出るので、メッセージを読んでどの名前が間違っているかを突き止め、正しい引数名に直してください。

safe_total(120, 80, 200) なら 400 です。すべて 0 なら 0 を返します。

要件

  1. 関数名は safe_total で、引数は price1・price2・price3 の3つ
  2. 3つの引数の合計を数値で return する
  3. starter_code にある間違った名前を正しい引数名に直す
  4. エラーが出る行を削らずに、正しく動くよう直す

入出力例

safe_total(120, 80, 200)400 safe_total(1200, 800, 1000)3000 safe_total(0, 0, 0)0 safe_total(0, 0, 500)500 safe_total(9800, 15000, 240)25040

ヒント

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

メモ

エラーを読んでみる

⌘S で保存