TabError: inconsistent use of tabs and spaces の原因と直し方
同じブロックの中でタブとスペースを混在させたときに出るエラーです。エディタ上では同じ見た目になるため、コードを読むだけでは原因に気づけません。
エラーメッセージの読み方
File "main.py", line 3
main.py- ファイル名
3- 行番号 — Pythonが構文解析を諦めた位置
TabError- エラークラス — 実行前の構文チェックで検出されました
inconsistent use of tabs and spaces in indentation- 内容 — 期待していたもの、または見つけられなかったもの
このエラーが出る典型パターン
パターン1
1 def f(): 2 x = 1 3 print(x) ^
同じブロックの中でタブとスペースを混ぜると、Pythonは字下げの深さを一意に決められません。1つのファイルではどちらかに統一します。
直し方: (タブ1) を (スペース4) にします。
パターン2
1 x = 5 2 if x > 0: 3 y = 1 4 print(y) ^
1行目はスペース、2行目はタブ、というように混ざると発生します。エディタの設定でタブを自動的にスペースへ変換しておくと防げます。
直し方: (タブ1) を (スペース4) にします。
パターン3
1 for i in range(3): 2 j = i 3 print(j) ^
見た目では気づきにくいバグの代表です。多くのエディタはタブとスペースを同じ幅で表示するため、目視での発見はほぼ不可能です。
直し方: (タブ1) を (スペース4) にします。
パターン4
1 x = 0 2 while x < 3: 3 x += 1 4 print(x) ^
whileループの中でタブとスペースが混ざると発生します。1つのブロックの中では統一が必要です。
直し方: (タブ1) を (スペース4) にします。
パターン5
1 n = 5 2 if n > 0: 3 result = "positive" 4 print(result) ^
if文の本体でも同じことが起きます。前の行がスペース、次の行がタブだと字下げの深さを一意に決められません。
直し方: (タブ1) を (スペース4) にします。
よくある誤解
「タブもスペースも同じ幅に見えるから同じはず」ではありません。Pythonの構文解析はタブとスペースを別の文字として扱うため、見た目が揃っていても内部的には食い違っています。
実務での勘所
この曖昧さが起きるのは、エディタがタブを何文字分の幅として表示するかを自由に設定できるためです。あるエディタでは4文字分、別のエディタでは8文字分の幅として表示されるため、書いた本人の画面では揃って見えても、実際のインデント階層は文字コードの並びとして解釈されます。Python 3はこの曖昧さを検出すると実行前にTabErrorとして拒否します。PEP 8(公式スタイルガイド)はタブを使わずスペース4つに統一することを推奨しており、エディタ側でTabキーの入力をスペースに変換する設定にしておけば、この種の混在自体が起こらなくなります。