Python の IndentationError: unexpected indent が直せない
IndentationError はインデントの幅が前後の行と揃っていない、あるいはタブと空白が混在しているときに出る。
PEP 8 のとおりスペース 4 個に統一し、エディタの可視化機能で混入を見つけるのが最短ルート。
#python#IndentationError#syntax#indent#tabs#PEP8
公開:
要約
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 に組み込んでおくと、再発を防げる。