こんにちは、かつコーチです。
Pythonを書き始めたばかりの頃、赤い文字でエラーが表示されると「何が起きたのか分からない」と手が止まってしまうことはありませんか。
私自身も学習を始めたころ、エラーメッセージを読まずにコードを闇雲に書き換えて、余計に混乱した経験があります。
実はPythonのエラーメッセージは、原因と場所を丁寧に教えてくれるとても親切な情報です。
この記事では、初心者がつまずきやすい代表的なエラーを、実際のエラーメッセージとともに解説します。
エラーメッセージとは?
トレースバックの読み方
Pythonでエラーが起きると、次のようなトレースバックが表示されます。
トレースバックとは、エラーが発生するまでにどの処理を通ってきたかを示す記録のことです。
Traceback (most recent call last):
File "main.py", line 3, in <module>
print(total)
NameError: name 'total' is not defined
一見難しそうに見えますが、注目すべきポイントは2つだけです。
File "main.py", line 3→ どのファイルの何行目でエラーが起きたか- 最後の行の
エラー名: 説明→ 何が原因でエラーが起きたか
慣れないうちは、まず最後の行だけを読む癖をつけると、エラー対応のハードルがぐっと下がります。
なぜエラーを正しく読むことが重要なのか
エラーメッセージを読まずにコードをあちこち書き換えると、原因とは無関係な箇所を触ってしまい、かえってバグが増えることがあります。
逆にエラーメッセージを正確に読めるようになると、自力で解決できる範囲が一気に広がります。
よくあるつまずきポイント・エラー対処
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("実行されます")
if・for・while・def・classなどの行末には、必ず:が必要というルールを覚えておきましょう。
エラーメッセージの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, 初心者向け, エラー解決