Code Fix

初級

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)
      ^
File "main.py", line 3 print(x) TabError: inconsistent use of tabs and spaces in indentation

同じブロックの中でタブとスペースを混ぜると、Pythonは字下げの深さを一意に決められません。1つのファイルではどちらかに統一します。

直し方: (タブ1) を (スペース4) にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  x = 5
 2  if x > 0:
 3      y = 1
 4  	   print(y)
      ^
File "main.py", line 4 print(y) TabError: inconsistent use of tabs and spaces in indentation

1行目はスペース、2行目はタブ、というように混ざると発生します。エディタの設定でタブを自動的にスペースへ変換しておくと防げます。

直し方: (タブ1) を (スペース4) にします。

この問題を解いてみる →

パターン3

 1  for i in range(3):
 2      j = i
 3  	   print(j)
      ^
File "main.py", line 3 print(j) TabError: inconsistent use of tabs and spaces in indentation

見た目では気づきにくいバグの代表です。多くのエディタはタブとスペースを同じ幅で表示するため、目視での発見はほぼ不可能です。

直し方: (タブ1) を (スペース4) にします。

この問題を解いてみる →

パターン4

 1  x = 0
 2  while x < 3:
 3      x += 1
 4  	   print(x)
      ^
File "main.py", line 4 print(x) TabError: inconsistent use of tabs and spaces in indentation

whileループの中でタブとスペースが混ざると発生します。1つのブロックの中では統一が必要です。

直し方: (タブ1) を (スペース4) にします。

この問題を解いてみる →

パターン5

 1  n = 5
 2  if n > 0:
 3      result = "positive"
 4  	   print(result)
      ^
File "main.py", line 4 print(result) TabError: inconsistent use of tabs and spaces in indentation

if文の本体でも同じことが起きます。前の行がスペース、次の行がタブだと字下げの深さを一意に決められません。

直し方: (タブ1) を (スペース4) にします。

この問題を解いてみる →

よくある誤解

「タブもスペースも同じ幅に見えるから同じはず」ではありません。Pythonの構文解析はタブとスペースを別の文字として扱うため、見た目が揃っていても内部的には食い違っています。

実務での勘所

この曖昧さが起きるのは、エディタがタブを何文字分の幅として表示するかを自由に設定できるためです。あるエディタでは4文字分、別のエディタでは8文字分の幅として表示されるため、書いた本人の画面では揃って見えても、実際のインデント階層は文字コードの並びとして解釈されます。Python 3はこの曖昧さを検出すると実行前にTabErrorとして拒否します。PEP 8(公式スタイルガイド)はタブを使わずスペース4つに統一することを推奨しており、エディタ側でTabキーの入力をスペースに変換する設定にしておけば、この種の混在自体が起こらなくなります。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)