Python の IndentationError: unexpected indent が直せない
IndentationError はインデントの幅が前後の行と揃っていない、あるいはタブと空白が混在しているときに出る。
PEP 8 のとおりスペース 4 個に統一し、エディタの可視化機能で混入を見つけるのが最短ルート。
公開:
要約
IndentationError: unexpected indent は、Python パーサが行の先頭インデントを「直前ブロックの規則と矛盾する」と判定したときに発生する。
ルールは 字句解析の Indentation(新しいタブで開く) と PEP 8(新しいタブで開く) に明記されている。
原則は「スペース 4 個に統一」「タブとスペースを混ぜない」の 2 点。
よくある原因
- コピペ行の余分なインデント: 他サイトのコードをそのまま貼ると、行頭にスペースが 1〜2 個余分に入ることがある
- タブとスペースの混在: 見た目が同じ 4 文字でも、タブ 1 個とスペース 4 個は Python から見て別物
- 空行や注釈の末尾空白: 一見空に見える行に空白が残っており、ブロック境界がずれる
- dedent 忘れ: 関数の中の
ifを抜けたつもりが、次のreturnを 1 段深いまま書いている
解決策
1. スペース 4 個に統一
def greet(name):
if name:
print(f"hi, {name}")
else:
print("hi")エディタの設定で「タブを押したらスペース 4 個を挿入」にしておく。
VS Code なら "editor.insertSpaces": true, "editor.tabSize": 4。
2. 空白を可視化して該当行を直す
VS Code: View → Render Whitespace → All (または editor.renderWhitespace: "all")
Vim: :set list listchars=tab:>-,trail:·
タブが混入している場合は、エディタの「Convert Indentation to Spaces」コマンドで一括変換できる。
3. 末尾空白を除去
.editorconfig で全行から末尾空白を消す設定が確実。
# .editorconfig
[*.py]
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
insert_final_newline = true4. python -tt で厳格チェック
python -tt script.py-tt オプションを付けるとタブ/スペース混在を エラーとして 検出する(-t は警告のみ)。
標準ライブラリの tabnanny(新しいタブで開く) でも同様の検査ができる。
python -m tabnanny script.pyCI に組み込んでおくと、再発を防げる。
実行例
実際に python:3.12 環境で余分なインデントを持つスクリプトを実行すると、3 行目で IndentationError: unexpected indent が発生し終了コード 1 で終了するが、インデントをスペース 4 個に統一した修正版では hi world と done が出力され正常に終了することを確認できる。
== versions ==
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
Python 3.12.13
git version 2.47.3
== run ==
--- python bad.py (IndentationError を想定)---
File "/tmp/tmp.1vIPJzM50n/bad.py", line 3
print("oops")
IndentationError: unexpected indent
終了コード: 1
--- 参考: python -m tabnanny で混在検査 ---
終了コード: 0
--- 修正: インデントを 4 スペースに統一 ---
--- python good.py (正常実行)---
hi world
done
終了コード: 0— 2026-06-29 時点の出力