Python IndentationErrorの原因と直し方
PythonのIndentationError(インデントエラー)は、コードの字下げ(インデント)が正しくないときに発生するエラーです。Pythonはインデントでコードのブロック構造を表現するため、他の言語にはないこの独特なエラーに戸惑う初心者は多いです。
IndentationErrorとは
Pythonでは、if文やfor文などのブロックをインデント(字下げ)で表現します。他の多くの言語では波括弧{}を使いますが、Pythonはインデントが文法の一部です。
# Pythonのブロック構造
if True:
print("これはブロックの中") # インデントあり
print("これはブロックの外") # インデントなし
インデントが正しくないと、以下のようなエラーが発生します。
IndentationError: expected an indented block
IndentationError: unexpected indent
IndentationError: unindent does not match any outer indentation level
パターン1: インデントがまったくない
if文やfor文の直後にインデントされた行がないとエラーになります。
# NG: インデントがない
if True:
print("hello")
# IndentationError: expected an indented block after 'if' statement
# OK: インデントする
if True:
print("hello")
# NG: 関数定義の中身がない
def my_function():
# IndentationError: expected an indented block
# OK: 何もしない場合はpassを使う
def my_function():
pass
passは「何もしない」を意味するPythonの文です。関数やクラスの中身をあとで書くつもりのときに使います。
パターン2: タブとスペースの混在
見た目では同じに見えても、タブ文字とスペース文字が混在しているとエラーになります。これが最もやっかいなパターンです。
# 見た目は同じでも...
if True:
print("スペース4つ") # スペース4つ
print("タブ1つ") # タブ1つ
# IndentationError: unindent does not match any outer indentation level
解決方法
# 統一する(スペース4つが推奨)
if True:
print("スペース4つ")
print("スペース4つ")
エディタの設定を確認する
VS Codeの場合、以下の設定を推奨します。
- 画面右下のインデント表示を「Spaces: 4」にする
- 設定で「Editor: Insert Spaces」をオンにする(タブキーを押すとスペースが入力される)
- 設定で「Editor: Detect Indentation」をオフにする
すでにタブとスペースが混在しているファイルの修正方法を紹介します。
# ターミナルでタブをスペースに一括変換
# macOS / Linux
expand -t 4 main.py > main_fixed.py
# Pythonスクリプトで確認
python -tt main.py
# -ttオプション: タブとスペースの混在を厳密にチェック
VS Codeでは、コマンドパレット(Ctrl+Shift+P / Cmd+Shift+P)から「Convert Indentation to Spaces」を選択すると一括変換できます。
パターン3: インデントの深さが不揃い
同じブロック内のインデント幅が統一されていないとエラーになります。
# NG: インデント幅がバラバラ
if True:
print("4スペース")
print("6スペース")
# IndentationError: unexpected indent
# OK: 同じブロックは同じ幅
if True:
print("4スペース")
print("4スペース")
# NG: ネストのインデントが不正
for i in range(3):
if i > 0:
print(i) # if文の中なのにインデントが足りない
# IndentationError: expected an indented block
# OK: 正しいネスト
for i in range(3):
if i > 0:
print(i) # 4 + 4 = 8スペース
パターン4: コピペによるインデント崩れ
Webサイトやチャットからコードをコピペすると、インデントが崩れることがあります。
# コピペ後にインデントが崩れた例
def calculate(x, y):
result = x + y # 2スペース
if result > 10: # 4スペース(不揃い)
return True # 6スペース(不揃い)
return False
# IndentationError
解決方法
# すべて4スペースに統一する
def calculate(x, y):
result = x + y
if result > 10:
return True
return False
コピペ後は必ずインデントを確認し、必要に応じて修正しましょう。VS Codeではコードを選択してTabでインデントを増やし、Shift+Tabでインデントを減らすことができます。
パターン5: 複数行にまたがる式のインデント
長い式を複数行に分けて書くときにもインデントに注意が必要です。
# NG: 中途半端なインデント
result = (first_value
+ second_value
+ third_value)
# 動くこともあるが、読みにくい
# OK: 開きカッコの位置に揃える
result = (first_value
+ second_value
+ third_value)
# OK: インデント1段分で揃える(PEP 8推奨)
result = (
first_value
+ second_value
+ third_value
)
# 関数呼び出しが長い場合
# OK: 引数を揃える
user = create_user(
name="太郎",
age=25,
email="[email protected]",
)
正しいインデントのルール
Pythonの公式スタイルガイド(PEP 8)で推奨されているルールをまとめます。
- インデントにはスペース4つを使う
- タブは使わない(スペースで統一する)
- 同じブロック内のインデント幅は揃える
- ネストが深くなるたびに4スペースずつ増やす
# 正しいインデントの例
def process_scores(scores):
total = 0
count = 0
for score in scores:
if score >= 0:
total += score
count += 1
else:
print(f"不正な値: {score}")
if count > 0:
average = total / count
return average
else:
return 0
IndentationErrorは慣れれば自然と出なくなります。エディタの設定を「スペース4つ」に統一しておくこと、コピペしたコードのインデントを必ず確認すること、この2点を意識するだけで大幅に減らせます。