Python SyntaxErrorの原因と解決法まとめ
PythonのSyntaxError(構文エラー)は、コードの書き方がPythonのルールに合っていないときに発生します。プログラミング初心者が最も遭遇しやすいエラーの一つですが、原因のパターンは決まっています。この記事ではよくある原因と修正方法を解説します。
SyntaxErrorとは
SyntaxErrorは、Pythonがコードを解釈する段階で「文法が間違っている」と判断したときに発生するエラーです。プログラムが実行される前にチェックされるため、コードは一行も実行されません。
エラーメッセージの読み方を覚えておきましょう。
File "main.py", line 3
print("hello"
^
SyntaxError: unexpected EOF while parsing
File "main.py", line 3: エラーが発生したファイルと行番号^: エラーの場所を指す矢印SyntaxError: ...: エラーの種類と説明
ただし、矢印が示す位置は「Pythonがエラーに気づいた場所」であり、実際の間違いは1行前にあることもよくあります。
パターン1: カッコの閉じ忘れ
最も多いSyntaxErrorの原因です。
# NG: 閉じカッコがない
print("こんにちは"
# SyntaxError: unexpected EOF while parsing
# OK
print("こんにちは")
# NG: リストの閉じ括弧がない
fruits = ["りんご", "みかん", "ぶどう"
# SyntaxError
# OK
fruits = ["りんご", "みかん", "ぶどう"]
# NG: 辞書の閉じ括弧がない
user = {"name": "太郎", "age": 25
# SyntaxError
# OK
user = {"name": "太郎", "age": 25}
対策として、カッコを開いたらすぐに閉じカッコも書く癖をつけましょう。VS Codeなどのエディタでは自動補完機能があるので活用してください。
パターン2: コロンの付け忘れ
if文、for文、関数定義など、ブロックの始まりにはコロン(:)が必要です。
# NG: コロンがない
if x > 10
print("大きい")
# SyntaxError: expected ':'
# OK
if x > 10:
print("大きい")
# NG
for i in range(5)
print(i)
# SyntaxError: expected ':'
# OK
for i in range(5):
print(i)
# NG
def greet(name)
return f"こんにちは、{name}さん"
# SyntaxError: expected ':'
# OK
def greet(name):
return f"こんにちは、{name}さん"
if、for、while、def、class、with、try、exceptの後には必ずコロンが必要だと覚えておきましょう。
パターン3: クォートの不一致
文字列を囲むクォートの種類が開始と終了で一致していないとエラーになります。
# NG: シングルとダブルが混在
message = "こんにちは'
# SyntaxError: EOL while scanning string literal
# OK
message = "こんにちは"
message = 'こんにちは'
# NG: 文字列内のアポストロフィと衝突
text = 'It's a pen'
# SyntaxError
# OK: ダブルクォートで囲む
text = "It's a pen"
# OK: エスケープする
text = 'It\'s a pen'
# NG: 複数行文字列のクォートが足りない
text = """
これは複数行の
文字列です
"
# SyntaxError
# OK: トリプルクォートで閉じる
text = """
これは複数行の
文字列です
"""
パターン4: 予約語の誤用
Pythonの予約語(キーワード)を変数名に使うとエラーになります。
# NG: classは予約語
class = "A"
# SyntaxError: invalid syntax
# OK: 別の名前を使う
class_name = "A"
grade = "A"
# NG: returnは予約語
return = 100
# SyntaxError
# OK
return_value = 100
result = 100
Pythonの主な予約語は以下の通りです。
# 予約語の一覧を確認する方法
import keyword
print(keyword.kwlist)
# ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await',
# 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except',
# 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is',
# 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return',
# 'try', 'while', 'with', 'yield']
パターン5: 代入と比較の混同
# NG: if文で=を使っている(代入になってしまう)
x = 10
if x = 10:
print("10です")
# SyntaxError: invalid syntax
# OK: 比較には==を使う
if x == 10:
print("10です")
=は代入、==は比較です。if文やwhile文の条件式では==を使いましょう。
デバッグのコツ
SyntaxErrorに遭遇したときの対処手順をまとめます。
手順1: エラーメッセージを読む
# エラーメッセージの例
# File "main.py", line 5
# if score > 80
# ^
# SyntaxError: expected ':'
「expected ’:‘」と書いてあれば、コロンが不足しているとわかります。
手順2: 指摘された行とその前の行を確認
# エラーは4行目を指しているが、原因は3行目のカッコ閉じ忘れ
scores = [80, 90, 70 # ← 原因はここ(行3)
average = sum(scores) # ← エラーが報告されるのはここ(行4)
Pythonがエラーに気づくのは、実際の間違いより後の行であることがあります。指摘された行に問題がなければ、その前の行も確認しましょう。
手順3: エディタの機能を活用する
VS Codeなどのエディタには、以下の機能があります。
- 対応するカッコのハイライト表示
- 構文エラーの下線表示(赤い波線)
- 自動インデント機能
これらの機能を活用すると、SyntaxErrorの多くは入力時点で発見できます。
手順4: コードを少しずつ書いて実行する
一度に大量のコードを書いてから実行すると、エラーの原因を特定しにくくなります。数行書いたら実行してエラーがないか確認する習慣をつけましょう。
SyntaxErrorは経験を積むにつれて自然と減っていきます。エラーが出ても慌てず、メッセージを読んで原因を特定する練習だと思って取り組んでみてください。