【Python】よくあるPythonエラーの読み方(IndentationError等)

Python

こんにちは、かつコーチです。

Pythonを書き始めたばかりの頃、赤い文字でエラーが表示されると「何が起きたのか分からない」と手が止まってしまうことはありませんか。
私自身も学習を始めたころ、エラーメッセージを読まずにコードを闇雲に書き換えて、余計に混乱した経験があります。

実はPythonのエラーメッセージは、原因と場所を丁寧に教えてくれるとても親切な情報です。
この記事では、初心者がつまずきやすい代表的なエラーを、実際のエラーメッセージとともに解説します。

エラーメッセージとは?

トレースバックの読み方

Pythonでエラーが起きると、次のようなトレースバックが表示されます。

トレースバックとは、エラーが発生するまでにどの処理を通ってきたかを示す記録のことです。

Traceback (most recent call last):
  File "main.py", line 3, in <module>
    print(total)
NameError: name 'total' is not defined

一見難しそうに見えますが、注目すべきポイントは2つだけです。

  1. File "main.py", line 3どのファイルの何行目でエラーが起きたか
  2. 最後の行のエラー名: 説明何が原因でエラーが起きたか

慣れないうちは、まず最後の行だけを読む癖をつけると、エラー対応のハードルがぐっと下がります。

なぜエラーを正しく読むことが重要なのか

エラーメッセージを読まずにコードをあちこち書き換えると、原因とは無関係な箇所を触ってしまい、かえってバグが増えることがあります。
逆にエラーメッセージを正確に読めるようになると、自力で解決できる範囲が一気に広がります。

よくあるつまずきポイント・エラー対処

IndentationError(インデントの誤り)

Before(つまずいたコード)

def greet(name):
print(f"こんにちは、{name}さん")

このコードを実行すると、次のエラーが出ます。

  File "main.py", line 2
    print(f"こんにちは、{name}さん")
    ^
IndentationError: expected an indented block after function definition on line 1

私が初めてこのエラーに出会ったとき、コード自体は正しく見えたので原因が分からず15分ほど悩みました。
原因は、defの後ろの処理にインデント(字下げ)が入っていなかったことでした。

Pythonは他の言語のような{ }(波かっこ)でブロックを表現せず、インデントでコードのまとまりを表現する言語です。
このルールを忘れると、必ずこのエラーに出会います。

After(改善したコード)

def greet(name):
    print(f"こんにちは、{name}さん")

defの中身をスペース4つ分(半角スペース4個、または1タブ)でインデントします。
エディタの自動インデント機能を使えば、この種のミスはかなり減らせます。

SyntaxError(構文の誤り)

Before(つまずいたコード)

if True
    print("実行されます")

実行すると、次のエラーが出ます。

  File "main.py", line 1
    if True
           ^
SyntaxError: expected ':'

SyntaxErrorとは、Pythonの文法ルールに違反しているときに出るエラーです。
このケースでは、if文の条件式の末尾に必要な:(コロン)が抜けています。

After(改善したコード)

if True:
    print("実行されます")

ifforwhiledefclassなどの行末には、必ず:が必要というルールを覚えておきましょう。
エラーメッセージのexpected ':'は「コロンが必要です」という意味なので、そのまま対処法が読み取れます。

NameError(未定義の変数を使う)

Before(つまずいたコード)

price = 1000
tax = price * 0.1
print(totla)

実行すると、次のエラーが出ます。

Traceback (most recent call last):
  File "main.py", line 3, in <module>
    print(totla)
NameError: name 'totla' is not defined

NameErrorは、定義していない名前(変数や関数)を使おうとしたときに出るエラーです。
このコード例では、totalと書くべきところをtotlaとタイプミスしています。

こうしたタイプミスは、変数名が長くなるほど起こりやすくなります。

After(改善したコード)

price = 1000
tax = price * 0.1
total = price + tax
print(total)

totalという変数を定義してから使うように修正します。
NameErrorが出たら、まずは変数名のスペルミスと、定義し忘れていないかの2点を疑いましょう。

TypeError(型の不一致)

Before(つまずいたコード)

age = 20
message = "私は" + age + "歳です"
print(message)

実行すると、次のエラーが出ます。

Traceback (most recent call last):
  File "main.py", line 2, in <module>
    message = "私は" + age + "歳です"
TypeError: can only concatenate str (not "int") to str

TypeErrorは、データの型(文字列・数値など)が処理と合っていないときに出るエラーです。
このコードでは、文字列(str型)と数値(int型)を+で直接連結しようとしたためエラーになっています。

After(改善したコード)

age = 20
message = "私は" + str(age) + "歳です"
print(message)

# f文字列を使うとさらにシンプルに書けます
message = f"私は{age}歳です"
print(message)

str(age)で数値を文字列に変換してから連結するか、f文字列(f"...")を使うことでエラーを避けられます。
実務ではf文字列を使う書き方の方が主流なので、こちらに慣れておくのがおすすめです。

まとめ

この記事のポイント

  • トレースバックは「どこで・何が原因で」エラーが起きたかを教えてくれる情報です
  • IndentationErrorはインデント(字下げ)の誤りが原因です
  • SyntaxError:の付け忘れなど、文法上のミスが原因です
  • NameErrorは変数の定義漏れやタイプミスが原因です
  • TypeErrorは文字列と数値など、型の不一致が原因です
  • エラーが出たら、まず最後の行の「エラー名: 説明」を読む習慣をつけましょう

次に読むべき記事

例外処理をしっかり書けるようになりたい方は、try-exceptの基本記事もあわせてご覧ください。
Noneの扱いでつまずきやすい方は、Noneの扱い方の記事も参考になります。

タグ: Python, 初心者向け, エラー解決

タイトルとURLをコピーしました