できない.dev

Python の IndentationError: unexpected indent が直せない

IndentationError はインデントの幅が前後の行と揃っていない、あるいはタブと空白が混在しているときに出る。
PEP 8 のとおりスペース 4 個に統一し、エディタの可視化機能で混入を見つけるのが最短ルート。

#python#IndentationError#syntax#indent#tabs#PEP8

公開:

要約

IndentationError: unexpected indent は、Python パーサが行の先頭インデントを「直前ブロックの規則と矛盾する」と判定したときに発生する。
ルールは 字句解析の IndentationPEP 8 に明記されている。
原則は「スペース 4 個に統一」「タブとスペースを混ぜない」の 2 点。

よくある原因

  1. コピペ行の余分なインデント: 他サイトのコードをそのまま貼ると、行頭にスペースが 1〜2 個余分に入ることがある
  2. タブとスペースの混在: 見た目が同じ 4 文字でも、タブ 1 個とスペース 4 個は Python から見て別物
  3. 空行や注釈の末尾空白: 一見空に見える行に空白が残っており、ブロック境界がずれる
  4. 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 = true

4. python -tt で厳格チェック

python -tt script.py

-tt オプションを付けるとタブ/スペース混在を エラーとして 検出する(-t は警告のみ)。
標準ライブラリの tabnanny でも同様の検査ができる。

python -m tabnanny script.py

CI に組み込んでおくと、再発を防げる。

この記事は役立ちましたか?