エラーを読んでみる
このレッスンで作るもの — エラーメッセージの読み方を覚え、壊れたコードを自力で直せるようにします。
エラーを読んでみる
プログラムは書けばだいたい失敗します。エラーは「あなたが下手だ」という宣告ではなく、Python が親切に出してくれた どこで何が起きたかの報告書 です。読み方さえ分かれば、いちばん頼りになる味方になります。
エラーは一気に読もうとせず、下記の 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 + price4price4 という引数はどこにも無いので、NameError が出ます。メッセージは name 'price4' is not defined のような形で、知らない名前そのもの を教えてくれます。
SyntaxError と違い、NameError は実行がその行に 届いたとき に出ます。つまり通らない行に間違いがあると、しばらく気づけません。
メッセージを実際に読む
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 という名前が存在しない」と読めます。あとは price4 を price3 に直すだけです。
英語だからと画面を閉じてしまうのが、いちばんもったいない対応です。
is not definedは「定義されていない」、invalid syntaxは「文法が不正」と、出てくる表現はほんの数種類しかありません。
直す手順を決めておく
エラーが出たときの手順をあらかじめ決めておくと、慌てずに済みます。おすすめは下記の 4 ステップです。
- いちばん下のエラー名を見て、文法の問題か名前の問題かを切り分ける
- 行番号の行を開き、その 1 つ上の行もあわせて眺める
- メッセージが名前や記号を名指ししていれば、それをそのまま探す
- 1 か所だけ直して、もう一度実行する
大事なのは 4 番目です。あちこち同時に直すと、どの変更が効いたのか分からなくなります。1 回に 1 か所だけ直して走らせる、を繰り返すのが結局いちばん速い直し方です。
エラーが出るのは、
Pythonがきちんと仕事をしている証拠です。むしろ怖いのは、エラーが出ないのに答えが間違っている状態です。エラーを歓迎できるようになると、学習の速度が一段上がります。
よくある間違い
- エラーの一番上だけ読む — 上のほうは
Pythonの内部の呼び出し履歴で、原因は いちばん下 に書いてあります。下から読むのが鉄則です。 - 行番号を信じすぎる —
SyntaxErrorは原因の 1 行あとを指すことがあります。指摘された行に問題が無ければ、上の行を疑います。 - エラーを消すために処理を消す — 動かない行をまるごと削ればエラーは消えますが、必要な処理まで消えます。直すのであって、消すのではありません。
やってみよう
関数 safe_total を実装してください。引数は price1、price2、price3 の 3 つで、3 件の合計を数値で return します。
用意されている starter_code はわざと壊してあります。実行すると NameError が出るので、メッセージを読んでどの名前が間違っているかを突き止め、正しい引数名に直してください。
safe_total(120, 80, 200) なら 400 です。すべて 0 なら 0 を返します。
要件
- 関数名は safe_total で、引数は price1・price2・price3 の3つ
- 3つの引数の合計を数値で return する
- starter_code にある間違った名前を正しい引数名に直す
- エラーが出る行を削らずに、正しく動くよう直す
入出力例
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