IndentationError: expected an indented block の原因と直し方
if・for・def・whileの本体を書き忘れたときに出る、Python学習者が最初につまずくエラーです。波括弧の代わりにインデントでブロックを表すPythonならではの挙動を整理します。
エラーメッセージの読み方
File "main.py", line 2
main.py- ファイル名
2- 行番号 — Pythonが構文解析を諦めた位置
IndentationError- エラークラス — 実行前の構文チェックで検出されました
expected an indented block after 'if' statement on line 1- 内容 — 期待していたもの、または見つけられなかったもの
このエラーが出る典型パターン
パターン1
1 if True: 2 print("yes") ^
ifの本体は必ずインデントが必要です。コロンの後で改行しただけでは、Pythonはどこまでが本体か判断できません。
直し方: (空) を (スペース4) にします。
パターン2
1 def greet(): 2 print("hi") ^
関数定義も本体のインデントが必須です。波括弧を使わないPythonでは、インデントそのものがブロックの境界を表します。
直し方: (空) を (スペース4) にします。
パターン3
1 for i in range(3): 2 print(i) ^
forループの本体も同様です。ループの中身がどこまでかは、インデントの深さだけで決まります。
直し方: (空) を (スペース4) にします。
パターン4
1 while True: 2 break ^
whileループの本体にもインデントが必要です。1行だけの本体でも省略はできません。
直し方: (空) を (スペース4) にします。
パターン5
1 class Dog: 2 pass ^
クラスの本体も同様にインデントが必要です。コロンの後の改行だけでは本体は始まりません。
直し方: (空) を (スペース4) にします。
よくある誤解
コロンを書けば本体は自動で認識されると思いがちですが、コロンは「ここからブロックが始まる」という合図でしかありません。実際に1段インデントした行がなければ、Pythonは本体がどこにも無いと判断します。
実務での勘所
Pythonがインデントをブロックの区切りとして採用しているのは、字下げと実際の構造が食い違うC言語のような言語で起きる「見た目とは違う場所で実行されるコード」というバグを構造的に防ぐためです。空のブロックをどうしても書きたい場合(実装を後回しにする関数の中身など)は、中身が何も無いことを示すpassという専用の文が用意されています。コロンの後に何も書かずに次の行を空にすると、それは「本体がまだ無い」ことを意味せず、IndentationErrorとして拒否されます。