Python IndentationError完全ガイド|原因と解決方法を初心者向けに解説
Pythonプログラミングを始めたばかりの方が最初に遭遇しやすいエラーの一つが「IndentationError」です。このエラーが出ると、プログラムが実行されずに困ってしまいますよね。本記事では、IndentationErrorが発生する原因から解決方法まで、初心者の方にも分かりやすく説明します。
1. IndentationErrorとは何か
IndentationErrorは、Pythonのコードにおけるインデント(字下げ)が正しくない場合に発生するエラーです。Pythonは他のプログラミング言語と異なり、インデントを使ってコードのブロックを定義する言語です。
例えば、JavaやC言語では波括弧{}を使ってコードのブロックを囲みますが、Pythonではインデント(スペースやタブ)でブロックを表現します。このインデントが一貫していなかったり、必要な場所にインデントがなかったりすると、IndentationErrorが発生します。
エラーメッセージの例
IndentationError: expected an indented block
IndentationError: unexpected indent
IndentationError: unindent does not match any outer indentation level
これらのメッセージが表示された場合、コードのインデントに問題がある可能性が高いです。
2. IndentationErrorが発生する主な原因
2-1. インデントのレベルが不揃い
Pythonでは、if文やfor文、関数定義など、複数行にわたるコードブロックの開始時に、必ず次の行をインデントする必要があります。
if x > 5:
print(\"xは5より大きい\") # ❌ エラー:インデントがない
print(\"処理完了\")
2-2. スペースとタブの混在
Pythonでは、インデントとしてスペースかタブのどちらかを選び、ファイル全体で統一する必要があります。スペースとタブが混在していると、見た目には同じ字下げに見えても、Pythonはエラーと判定します。
if x > 5:
print(\"スペースでインデント\")
\tprint(\"タブでインデント\") # ❌ エラー:スペースとタブが混在
2-3. インデントの字数が不一致
関数内の複数のブロックがある場合、同じレベルのブロックは同じ字数のインデントで始まる必要があります。
def my_function():
if condition:
print(\"4スペース\")\n else: # ❌ エラー:2スペースでインデント
print(\"別の処理\")
2-4. 空のコードブロック
if文やfor文の後に、何も処理がない場合、「IndentationError: expected an indented block」というエラーが発生します。
if x > 5:
# ❌ エラー:処理がない
3. IndentationErrorの解決手順
3-1. エラーメッセージから行番号を確認
IndentationErrorが発生した場合、エラーメッセージに問題のある行番号が表示されます。まずはこの行番号を確認しましょう。
File \"script.py\", line 5
if x > 5:\nIndentationError: expected an indented block
この例では、5行目に問題があることがわかります。
3-2. コードエディターの設定を確認
推奨:スペース4つを標準として使用する
Pythonの公式スタイルガイド「PEP 8」では、インデントにスペース4つを使用することが推奨されています。お使いのエディターをこの設定に統一しましょう。
- VS Code: 設定 → 「editor.tabSize」を「4」に、「editor.insertSpaces」を「true」に
- PyCharm: Preferences → Editor → Code Style → Python → インデントサイズを「4」に
- Sublime Text: Preferences → Settings → 「tab_size」を「4」に、「translate_tabs_to_spaces」を「true」に
3-3. 問題のある行を修正
以下の点をチェックしてください:
- コロン(:)の後の行は必ずインデントされているか
- 同じレベルのコードは同じ字数のインデントか
- スペースとタブが混在していないか
- 不要なインデントがないか
3-4. コード全体を整形し直す
大規模なファイルの場合、インデントを一括修正するツールが便利です。
# autopep8を使用した自動修正
pip install autopep8
autopep8 --in-place --aggressive script.py
4. 正しいコード例
4-1. 基本的なif文
x = 10
if x > 5:
print(\"xは5より大きい\")
print(\"処理を実行\")\nelif x == 5:
print(\"xは5と等しい\")\nelse:
print(\"xは5より小さい\")
4-2. for文のインデント
fruits = [\"apple\", \"banana\", \"cherry\"]
for fruit in fruits:
print(f\"I like {fruit}\")\n if fruit == \"banana\":
print(\"Banana is my favorite!\")
4-3. 関数定義のインデント
def calculate_sum(a, b):
\"\"\"2つの数値を足し合わせる関数\"\"\"\n result = a + b\n return result\n\n# 関数呼び出し\nanswer = calculate_sum(5, 3)\nprint(answer) # 出力: 8
4-4. クラス定義のインデント
class Dog:\n def __init__(self, name):\n self.name = name\n\n def bark(self):\n print(f\"{self.name} says: Woof!\")\n\n# クラスの使用\nmy_dog = Dog(\"Buddy\")\nmy_dog.bark() # 出力: Buddy says: Woof!
4-5. ネストされたブロック
numbers = [1, 2, 3, 4, 5]\n\nfor num in numbers:\n if num % 2 == 0:\n print(f\"{num} は偶数です\")\n else:\n print(f\"{num} は奇数です\")
5. よくある間違いと対策
5-1. 間違い:コロンの後に処理が同じ行にある
# ❌ 間違い\nif x > 5: print(\"大きい\")\n\n# ✅ 正解\nif x > 5:\n print(\"大きい\")
対策: Pythonでは、コロンの後は必ず改行してインデントします。
5-2. 間違い:空のコードブロック
# ❌ 間違い\nfor i in range(5):\n\n# ✅ 正解\nfor i in range(5):\n pass # 処理がない場合はpassを使用
対策: コードブロックが空の場合、passステートメントを使用します。
5-3. 間違い:コピーペーストでインデントが崩れる
異なるエディターからコードをコピーペーストすると、タブとスペースが混在することがあります。
対策: 専用ツール(autopep8やblack)で自動修正を行うか、コード全体を選択して再インデントします。
5-4. 間països味:関数内で処理がない
# ❌ 間違い\ndef my_function():\n\n# ✅ 正解\ndef my_function():\n pass
5-5. 間違い:複数行の文字列内のインデント
# ❌ 間違い(見た目には正しく見えるが)\nif condition:\n text = \"\"\"これは\n複数行の\n文字列です\"\"\"\n\n# ✅ より安全な方法\nif condition:\n text = (\"これは\"\n \"複数行の\"\n \"文字列です\")
6. デバッグのコツ
6-1. インデントを可視化
多くのエディターでは、インデントを表示する機能があります。VS Codeでは、設定で「editor.renderWhitespace」を「all」に変更すると、スペースとタブを可視化できます。
6-2. Lintツールを使用
コードをチェックするツール(pylintやflake8)を使用すると、インデントエラーを事前に検出できます。
pip install pylint\npylint script.py
6-3. IDEの自動フォーマット機能
VS CodeやPyCharmなどのIDEには、コードを自動的に整形する機能があります。
VS Code: Shift + Alt + F で自動フォーマット
7. まとめ
IndentationErrorは、Pythonを学ぶ際に誰もが一度は経験するエラーです。しかし、以下の点を意識することで、ほとんどの場合は避けられます:
- スペース4つを統一して使用する
- スペースとタブを混在させない
- コロンの後は必ずインデントする
- 同じレベルのコードは同じ字数でインデントする
- 空のブロックにはpassを使用する
エディターの設定を正しく行い、自動フォーマットツールを活用することで、IndentationErrorは大幅に減らせます。Pythonプログラミングを快適に行うために、これらの点を心がけましょう。
