← 中文资源

简体中文版本

Python IndentationError — 意外缩进

通过让代码块缩进与前一行冒号匹配、并消除单文件内的混合 tab,解决 IndentationError: unexpected indent。

阅读英文原文

症状

遇到“Python IndentationError — 意外缩进”时靠猜测只会浪费时间。请按证据排查:先复现症状,再执行针对性诊断,定位根因后修复,并用明确检查验证结果。

可观察到的症状包括:

  • Python 抛出 “IndentationError: unexpected indent” 并指向某一行
  • 编辑器里该行看起来是对齐的
  • 从别处粘贴代码后出现该错误

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

python -c "import sys; [print(i, repr(l)) for i,l in enumerate(open('app.py'),1) if l.startswith(' ')]" | head

repr 会把 tab 显示为 \t,直接暴露屏幕上看似对齐的混合缩进。

步骤 2

python -m py_compile app.py

报告的行号与插入符精确指向第一处逻辑不一致;修复后再编译。

常见诱因(按出现频率排序):

  • 上一行并未开启代码块,但本行却缩进了
  • 文件混用 tab 与空格,视觉对齐与逻辑缩进不一致
  • 编辑器在注释或空行后自动插入了缩进

根因

Python 仅依据缩进推断代码块结构。任何未跟在以冒号开头的块语句之后的缩进都是意外缩进;tab 与空格不一致会使解析器看到的缩进与编辑器渲染的不同。

修复

统一用空格缩进(每层四个),清除文件中的 tab,并确保每个缩进行都归属于上一逻辑行以冒号开启的代码块。

注意:部分编辑器会静默把 tab 转为空格;应统一缩进策略并用 editorconfig 强制。

def total(items):
    sum_ = 0
    for it in items:
        sum_ += it          # consistent 4-space indent
    return sum_

# Mixed tabs/spaces below triggers: IndentationError: unexpected indent
def bad(items):
    total_ = 0
	for it in items:        # tab instead of spaces
        total_ += it
    return total_

验证

用 python -m py_compile 重新编译并运行模块,错误应消失;加入拒绝 tab 的 lint 步骤以防复发。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。