できない.dev

Python で「TabError: inconsistent use of tabs and spaces in indentation」が直らない

同じブロックでタブとスペースが混在するとインデント幅が曖昧になり TabError になる。
インデントをスペース 4 に統一し、エディタでタブをスペースに変換する。

公開: 更新:

実行例あり(2026-09-01 に実環境で検証)

要約

TabError: inconsistent use of tabs and spaces in indentation は、同じインデントブロックの中でタブとスペースが混ざっていて、Python がインデント幅を一意に決められないときに出る。

Python 3 はタブとスペースの混在を曖昧として拒否する。
見た目では揃っていても文字種が違うと発生するので、インデントをスペースに統一するのが確実。

実行例

cat -A で見るとスペース 4 つの行の次にタブ始まりの行があり、実行すると 3 行目で TabError になって終了コードは 1 になる。python -m tabnanny は落ちた行をそのまま指し示し、expand -t 4 でタブを空白に展開したファイルは py_compile を通る。

$ cat -A script.py
if True:$
    x = 1$
^Iy = 2$
$ python script.py
File "/tmp/tmp.WnXD2MsjyS/script.py", line 3
    y = 2
TabError: inconsistent use of tabs and spaces in indentation
$ echo $?
1
$ python -m tabnanny script.py
script.py 3 '\ty = 2'
$ echo $?
0
$ expand -t 4 script.py > fixed.py
$ cat -A fixed.py
if True:$
    x = 1$
    y = 2$
$ python -m py_compile fixed.py
$ echo $?
0

— 2026-09-01 時点の出力

検証環境

検証日
実行環境
python:3.12 Debian GNU/Linux 13 (trixie)
バージョン
  • Python 3.12.14
  • Git 2.47.3

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  1. ブロック内の混在: 上の行はタブ、下の行はスペース、のように行ごとに文字種が違う。
  2. エディタ設定: Tab キーがタブ文字を挿入する設定で、スペース基準の既存コードに追記した。
  3. コピペ由来: 貼り付けた行だけインデント文字が異なる。

解決策

1. 混在を可視化する

cat -A script.py | head

タブは ^I、行末は $ で表示されるので、どの行がタブ/スペースかを目視できる。

2. インデントをスペース 4 に統一する

エディタ設定を .editorconfig で固定すると再発しにくい。

[*.py]
indent_style = space
indent_size = 4

3. 不整合を検出する

python -m tabnanny script.py

標準ライブラリの tabnanny が、曖昧なインデントを行番号付きで報告する。

4. まとめて変換する

expand -t 4 script.py > fixed.py

タブを 4 スペースへ展開する。
差分を確認してから元ファイルへ反映する。

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