← 中文资源

简体中文版本

Python TabError — tab 与空格混用不一致

通过把单个文件统一为空格缩进、并配置编辑器不再输出 tab,修复 TabError: inconsistent use of tabs and spaces。

阅读英文原文

症状

本篇指南处理“Python TabError — tab 与空格混用不一致”。请从症状出发,按顺序执行诊断,在推进前确认每个假设;随后通过修复与验证步骤闭环。

可观察到的症状包括:

  • Python 抛出 “TabError: inconsistent use of tabs and spaces in indentation”
  • 文件在一台机器可运行,在另一台上报错
  • 错误集中在从其他编辑器粘贴来的代码附近

诊断

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

步骤 1

grep -nP "\t" app.py | head

缩进处出现命中即表明风格混用;Python 3 拒绝臆测。

步骤 2

expand -t 4 app.py > app_fixed.py && python -m py_compile app_fixed.py

按预期宽度展开 tab 后再编译,可在提交前确认修复。

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

  • 同一缩进层级中部分行用 tab、部分行用空格
  • 编辑器 tabstop 与 Python 的 tab 展开(8 列)不同
  • 补丁或合并把一种风格引入到使用另一种风格的文件中

根因

Python 3 拒绝在同一代码块内混用 tab 与空格,因为二者不存在无歧义的公共宽度。一旦检测到不一致缩进,词法分析阶段即抛出 TabError。

修复

用 expand 或格式化工具把整个文件转为空格,再加入 indent_style = space 的 .editorconfig 与拒绝 tab 的 pre-commit 钩子。

注意:tab 转空格会改变字节偏移;不要与功能改动放在同一提交,以保持 diff 可读。

def process(rows):
    out = []
    for row in rows:
        out.append(row.strip())
    return out

# One tab-indented line among space-indented lines -> TabError
def broken(rows):
    out = []
    for row in rows:
	    out.append(row)  # tab here
    return out

验证

重新编译并运行,grep tab 应无结果;在第二个操作系统上运行同一文件以确认可移植。

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

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