Pythonを学び始めたばかりのころ、赤い文字で長いエラー文が出ると一気に不安になりますよね。
英語ばかりで読めない。 どこを直せばいいのかわからない。
そんなふうに感じる人はとても多いです。
でも安心してください。Pythonのエラー文は、全部を完璧に読む必要はありません。
大事なのは、読む順番を知ることです。
この記事では、IT初心者の方に向けて、Pythonのエラー文tracebackの見方をやさしく解説します。
私自身も、実務でエラーを読むときは毎回すべての行をじっくり読んでいるわけではありません。 見るべき場所を先に見て、原因を絞り込む。
この読み方を覚えるだけで、エラーへの怖さはかなり減ります。
Pythonのエラー文 traceback とは何か¶
まずは、tracebackという言葉から整理しておきましょう。
Pythonでエラーが起きると、画面にエラーの詳細が表示されます。この表示全体をtracebackと呼ぶことがあります。
tracebackは、どのファイルの何行目を実行して、どの処理の途中で止まったのかを教えてくれる記録です。
たとえば、次のようなコードを書いたとします。
numbers = [10, 20, 30]
print(numbers[5])
このコードを実行すると、次のようなエラーが出ます。
Traceback (most recent call last):
File "sample.py", line 3, in <module>
print(numbers[5])
IndexError: list index out of range
最初に見ると、少し怖いですよね。
でも、ここに書かれている情報はかなり親切です。Pythonは怒っているのではなく、どこで何が起きたのかを説明してくれています。
エラー文は下から読むのが基本¶
初心者の方にまず覚えてほしいのは、Pythonのエラー文は下から読むということです。
上から順番に読もうとすると、Fileやlineなどの見慣れない単語が出てきて混乱しやすくなります。もちろん上にも大事な情報はありますが、最初に読むべきなのは一番下です。
先ほどのエラーをもう一度見てみましょう。
Traceback (most recent call last):
File "sample.py", line 3, in <module>
print(numbers[5])
IndexError: list index out of range
一番下には、こう書かれています。
IndexError: list index out of range
これは、エラーの種類と説明です。
IndexErrorは、リストなどの番号指定で問題が起きたときに出るエラーです。list index out of rangeは、リストの範囲外を指定しているという意味です。
numbersには 10, 20, 30の3つしか入っていません。Pythonのリストは0番から数えるので、使える番号は0, 1, 2です。
5番目は存在しません。
だからエラーになったのです。
このように、一番下の行を読むだけで、原因の方向性がかなり見えてきます。
tracebackで見るべき場所は大きく3つ¶
エラー文に慣れていないうちは、どこを読めばいいのか迷います。
そこで、最初は見る場所を3つに絞ってください。
| 見る場所 | 何がわかるか | 初心者が確認すること |
|---|---|---|
| 一番下の行 | エラーの種類と原因のヒント | どんな種類のエラーか |
| File と line の行 | エラーが起きたファイル名と行番号 | 何行目を見ればいいか |
| 表示されているコード行 | 実際に止まった処理 | 変数名や関数の使い方が正しいか |
この3つを押さえるだけで、エラー文はかなり読みやすくなります。
全部を理解しようとしなくて大丈夫です。まずは、エラーの種類、行番号、止まったコードを見るところから始めましょう。
一番下の行でエラーの種類を確認する¶
Pythonのエラー文で最も重要なのは、一番下にあるエラー名です。
エラー名は、Pythonが問題を分類してくれているラベルのようなものです。
たとえば、次のようなエラーがあります。
| エラー名 | よくある原因 | 初心者向けの見方 |
|---|---|---|
| SyntaxError | 文法の書き間違い | コロンやカッコ、スペルを確認 |
| IndentationError | インデントのズレ | 半角スペースの数や位置を確認 |
| NameError | 変数名や関数名の間違い | 定義前に使っていないか確認 |
| TypeError | データ型の使い方ミス | 文字列と数値を混ぜていないか確認 |
| ValueError | 値の内容が不適切 | int変換などに変な値を渡していないか確認 |
| IndexError | リストの番号ミス | 存在しない番号を指定していないか確認 |
| KeyError | 辞書のキー指定ミス | 存在しないキーを使っていないか確認 |
| ModuleNotFoundError | モジュールが見つからない | インストールやファイル名を確認 |
初心者のうちは、エラー名を見てもすぐに意味がわからないかもしれません。
それで普通です。
大切なのは、エラー名を検索できる状態になることです。「Python エラー名 原因」のように検索すると、解決の手がかりが見つかりやすくなります。
文法エラーでよくつまずく方は、以下の記事も参考にしてください。
【関連記事】PythonのSyntaxErrorとは?初心者がつまずく構文エラーの原因と対処法を徹底解説
File と line で修正する場所を探す¶
次に見るのは、Fileとlineが書かれている行です。
次の例を見てみましょう。
Traceback (most recent call last):
File "main.py", line 8, in <module>
total = price + tax
NameError: name 'tax' is not defined
ここでは、main.pyというファイルの8行目でエラーが起きています。
初心者の方は、エラー文を見たあとに何となくコード全体を眺めてしまいがちです。しかし、まず見るべきなのはlineに書かれた行です。
NameError: name 'tax' is not definedとあるので、taxという名前が定義されていないことがわかります。
price = 1000
total = price + tax
print(total)
このコードでは、priceは定義されていますが、taxは定義されていません。
次のようにtaxを追加すれば解決します。
price = 1000
tax = 100
total = price + tax
print(total)
エラー文のlineは、あなたを責めるためのものではありません。
むしろ、ここを見てくださいという案内です。
表示されたコード行の前後も見る¶
tracebackには、エラーが起きた行のコードも表示されます。
ただし、実際の原因がその行だけにあるとは限りません。
たとえば、次のコードを見てください。
name = input("名前を入力してください: ")
age = input("年齢を入力してください: ")
next_age = age + 1
このコードを実行すると、次のようなエラーになります。
Traceback (most recent call last):
File "main.py", line 4, in <module>
next_age = age + 1
TypeError: can only concatenate str (not "int") to str
line4のage + 1で止まっています。
しかし、根本原因はその前のinputにあります。input関数で受け取った値は、見た目が数字でも文字列として扱われます。
だから、文字列のageに数値の1を足そうとしてTypeErrorが出たのです。
修正するには、int関数で数値に変換します。
name = input("名前を入力してください: ")
age = int(input("年齢を入力してください: "))
next_age = age + 1
print(next_age)
このように、エラーが出た行だけでなく、その直前で変数に何が入ったのかを見ることが大切です。
私も実務でエラーを見るときは、止まった行そのものよりも、その値がどこから来たのかを追うことが多いです。エラー行はゴールではなく、原因をたどるスタート地点だと考えると読みやすくなります。
tracebackが長いときは自分のコードを探す¶
関数やライブラリを使い始めると、tracebackが長くなることがあります。
そのときも、基本は同じです。まず一番下でエラーの種類を見て、次に自分が書いたファイル名を探します。
main.pyやapp.pyなど、自分が編集しているファイルが出てきたら、そのlineを確認しましょう。
ライブラリの中で止まっているように見えても、原因は自分が渡した値にあることが多いです。
初心者がよく見る traceback のパターン¶
ここからは、Python初心者がよく出会うエラーを具体例で見ていきます。
実際に同じような画面を見たことがある方も多いはずです。
SyntaxErrorは文法の間違い¶
SyntaxErrorは、Pythonの文法として正しくないときに出ます。
たとえば、if文の最後にコロンを書き忘れるとエラーになります。
score = 80
if score >= 70
print("合格です")
実行すると、次のようなエラーが出ます。
File "main.py", line 3
if score >= 70
^
SyntaxError: expected ':'
この場合、一番下に expected ':' とあります。
コロンが必要です、という意味です。
score = 80
if score >= 70:
print("合格です")
SyntaxErrorでは、^ の位置もヒントになります。必ずしも完全に正しい位置を示すとは限りませんが、このあたりが怪しいという目印になります。
IndentationErrorは字下げのズレ¶
Pythonでは、インデントがとても重要です。
if文やfor文の中の処理は、字下げして書く必要があります。
score = 80
if score >= 70:
print("合格です")
このコードでは、printが字下げされていません。
File "main.py", line 4
print("合格です")
^
IndentationError: expected an indented block after 'if' statement on line 3
このエラーが出たら、まず行頭のスペースを確認しましょう。
score = 80
if score >= 70:
print("合格です")
インデントでつまずきやすい方は、以下の記事もあわせてご覧ください。 【関連記事】PythonのIndentationErrorが出たときの対処法
ModuleNotFoundErrorは読み込みたいものが見つからない¶
ModuleNotFoundErrorは、importしたモジュールが見つからないときに出ます。
import requests_extra
存在しないモジュール名を書くと、次のようなエラーになります。
ModuleNotFoundError: No module named 'requests_extra'
この場合、確認するポイントは主に3つです。
- モジュール名のスペルが正しいか
- pipでインストール済みか
- 実行しているPython環境が合っているか
たとえば requests を使いたい場合は、次のようにインストールします。
pip install requests
ただし、仮想環境を使っている場合、別の環境にインストールしてしまうことがあります。これは初心者だけでなく、実務でもよく起きます。
私も新人メンバーのサポートをしていて、ライブラリを入れたのに動きませんという相談を何度も受けました。原因の多くは、インストールしたPythonと実行しているPythonが違うことでした。
このエラーで困っている場合は、以下の記事もあわせて確認してください。 【関連記事】PythonのModuleNotFoundErrorって何?解決するにはどうしたらいいの?
エラー文を読むときにやってはいけないこと¶
ここまで読むと、エラー文は意外と読めそうだと感じてきたかもしれません。
一方で、初心者のころにやりがちな遠回りもあります。
まず、エラー文を読まずにコードを何となく書き換えることです。
気持ちはとてもわかります。赤い文字を見ると、早く消したくなりますよね。
しかし、原因を見ずに修正すると、別のエラーが増えることがあります。
次に、エラー文をすべてコピーして検索することです。
もちろん検索してもよいのですが、自分のファイル名や行番号まで含めて検索しても、同じ結果はなかなか見つかりません。検索するなら、エラー名と最後の説明文を中心に使うのがおすすめです。
Python TypeError unsupported operand type int str
最後に、エラーを怖がりすぎることです。
エラーは失敗ではありません。Pythonが止まってくれたからこそ、問題に気づけます。
エラー解決の基本手順¶
実際にエラーが出たときは、次の流れで確認すると落ち着いて対応できます。
最初はこの手順を横に置いて、チェックリストのように使ってもよいです。
- 一番下の行でエラー名を見る
- File と line で場所を確認する
- 表示されたコード行を見る
- その行で使っている変数の中身を確認する
- 必要ならエラー名と説明文で検索する
この順番に慣れると、エラーを見るスピードが上がります。
特に4番目の変数の中身を確認するは重要です。初心者のエラーは、思っていた値と実際の値が違うことから起きるケースがとても多いです。
たとえば、次のようにprintで確認できます。
age = input("年齢を入力してください: ")
print(age)
print(type(age))
next_age = age + 1
type を使うと、変数のデータ型がわかります。
実行すると、ageはstrと表示されるはずです。数字を入力しても、inputの結果は文字列だからです。
この確認ができるようになると、TypeErrorの原因を自分で見つけやすくなります。
私が実務で意識している読み方¶
私はエンジニアとして10年ほどコードを書いてきましたが、今でもエラーは毎日のように見ます。
経験を積むとエラーが出なくなる、ということはありません。
変わるのは、エラーが出たときの反応です。
初心者のころは、エラーを見ると自分が間違っていると責められているように感じるかもしれません。でも実務では、エラーは会話のようなものです。
Pythonが、ここで止まりました、この値が変です、この名前が見つかりませんと教えてくれています。
私が特に意識しているのは、エラー文を読んだらすぐに仮説を立てることです。
TypeErrorなら、型が違うのではないか。NameError なら、変数名のスペルが違うのではないか。IndexErrorなら、リストの件数より大きい番号を指定していないか。
このように、エラー名から原因候補を2つか3つに絞ります。
いきなり大きくコードを書き換えるのではなく、小さく確認して、小さく直す。これは新人エンジニアを育成するときにもよく伝えている考え方です。
エラーを読む力は、特別な才能ではありません。
何度も同じパターンを見ることで、少しずつ育っていくスキルです。
まとめ¶
Pythonのエラー文tracebackは、最初はとても難しく見えます。
でも、読む順番を知れば怖くありません。
まずは一番下の行を見て、エラーの種類を確認します。次に File と line を見て、どのファイルの何行目で止まったのかを確認します。
そして、表示されたコード行と、その前後の変数の中身を見ていきます。
すべてを完璧に理解する必要はありません。
大切なのは、エラー文を無視せず、ヒントとして使うことです。
エラーが出るたびに少しずつ読める部分が増えていきます。最初は赤い文字が怖くても、慣れてくると、エラー文は問題解決への地図のように見えてきます。
Python学習では、エラーに出会う回数が多いほど成長できます。
ここまでお読みいただきありがとうございました。