TL;DR
コロン(:)を書いたのに、その下のブロックが空になっています。Pythonは最低でも1つのステートメントがないと処理を続けられません。実際のコードを追加するか、プレースホルダーとしてpassを入れましょう。また、タブとスペースを混在させていないか確認してください — Python 3ではこれはハードエラーとして扱われます。
このエラーが発生する原因
Pythonでは、コロンは単なる句読点ではなく「約束」です。:で終わるすべてのステートメントの後には、インデントされたブロックが必要です。これはif、else、elif、for、while、def、class、with、try/except/finallyすべてに適用されます。
ブロックの本体を省略すると、Pythonは次のエラーを投げます:
IndentationError: expected an indented block
よくあるケースと修正方法
1. 空の関数またはクラスの本体
関数やクラスのスタブを作ったが、まだ本体を書いていない場合:
# 悪い例
def my_function():
class MyClass:
修正方法 — passを追加する:
# 良い例
def my_function():
pass
class MyClass:
pass
2. コメントだけの本体
コメントはステートメントとしてカウントされません。Pythonはブロックが空だと判断します — その# TODOは存在しないも同然です:
# 悪い例
def process():
# TODO: ここを実装する
def main():
# 近日公開
修正方法 — コメントにpassを添える:
# 良い例
def process():
# TODO: ここを実装する
pass
3. if/elseで本体が欠けている場合
# 悪い例
if condition:
else:
do_something()
修正方法:
# 良い例
if condition:
pass
else:
do_something()
4. try/exceptブロックが空の場合
# 悪い例
try:
except ValueError:
handle_error()
修正方法:
# 良い例
try:
risky_call()
except ValueError:
handle_error()
5. タブとスペースの混在
これは見落としやすいケースです。エディタ上ではインデントされているように見えるのに、ある行はタブ、別の行はスペースを使っています。Python 3はこれを完全に拒否します。TabErrorが出ることもありますが、IndentationErrorとして現れることもあります。
# 悪い例(ある行はタブ、別の行はスペース)
def greet():
print("hello") # タブ
print("world") # スペース
スペースに統一しましょう — PEP 8が推奨するように1レベルにつき4スペース:
def greet():
print("hello")
print("world")
エディタで一括変換するには:VS Code → コマンドパレット → 「インデントをスペースに変換」。vimの場合は:retabを実行。ターミナルからは:
expand -t 4 myfile.py > myfile_fixed.py
6. 誤ってインデントが外れたブロック
# 悪い例
for item in items:
print(item) # インデントされていない
修正方法:
# 良い例
for item in items:
print(item)
トレースバックの読み方
Pythonのエラーメッセージは問題の箇所を直接示してくれます:
File "script.py", line 5
def helper():
^
IndentationError: expected an indented block
5行目がPythonが本体の始まりを期待した場所です。キャレットの前の行を確認してください — そこにコロンがあります。その下のブロックが空か、インデントが間違っています。
簡易チェックリスト
- 行末の
:の後は、必ず次の行にインデントされたブロックが必要です。 - 空のブロックには
passが必要です。 - コメント単独ではブロックの要件を満たしません — その下に
passを追加してください。 - スペースのみを使用してください — 1レベルにつき4スペース。Tabキーを押したときにスペースが挿入されるようエディタを設定しましょう。
python -m py_compile yourfile.pyを実行して、実行前に構文エラーを検出してください。
修正の確認
ファイルを実行せずに構文チェックを行うには:
python -m py_compile script.py
echo $? # 0はクリーンを意味する
より広範なスタイルとエラーチェックには、flake8がより多くの項目をカバーします:
pip install flake8
flake8 script.py
出力がなければ問題なしです。py_compileが0で終了すれば、IndentationErrorは解消されています。
このエラーを防ぐエディタ設定
- VS Code:
settings.jsonに"editor.tabSize": 4と"editor.insertSpaces": trueを設定する。 - PyCharm:Pythonファイルに対してデフォルトで4スペースのインデントが設定されています。
- Vim:
.vimrcにautocmd FileType python setlocal expandtab shiftwidth=4 tabstop=4を追加する。

