Python IndentationError: expected an indented block の原因と解決方法

IndentationError: expected an indented block とは

Pythonプログラミングにおいて「IndentationError: expected an indented block」は非常によく遭遇するエラーです。このエラーは、コードブロックが期待されるインデント(字下げ)を持っていない場合に発生します。Pythonはインデントを使ってコードの構造を定義するため、このエラーは文法上の問題を示しています。

Pythonでは、インデントは単なる見やすさのためだけでなく、コードの構造を定義する重要な文法要素です。

エラーの発生パターン

このエラーは主に以下のようなケースで発生します。

パターン1: Missing Indentation after a Block Statement

def my_function():
print("Hello") # インデントが足りない

def, if, for, whileなどのブロックを定義するステートメントの後は、必ずインデントされたコードブロックが続く必要があります。この例ではprint("Hello")がインデントされていません。

def my_function():
    print("Hello") # 適切にインデント

パターン2: Empty Block without pass

if True:
# 何もしないつもりだが、インデントされた行がない

ブロックステートメントの後にコードがない場合でも、Pythonは何らかのインデントされた内容を期待します。何もしないことを明示するにはpassステートメントを使用します。

if True:
    pass # 何もしないことを明示

パターン3: Inconsistent Indentation (Tabs vs Spaces)

def calculate():
    result = 10
	print(result) # タブとスペースが混在

Pythonでは、一つのファイル内でタブとスペースを混在させることは推奨されません(通常はエラーとして扱われます)。ほとんどのIDEはタブをスペースに変換する設定を持っています。

def calculate():
    result = 10
    print(result) # 全てスペースでインデント
PythonのPEP 8スタイルガイドでは、インデントには4つのスペースを使用することを推奨しています。一貫したインデントは、コードの可読性を高め、このようなエラーを防ぎます。

根本原因の特定方法

エラーメッセージには、問題が発生したファイル名と行番号が示されます。その行と、その直前のブロック定義(def, ifなど)の行を注意深く確認してください。特に、インデントレベルが視覚的に正しいか、タブとスペースが混在していないかをチェックしましょう。

def process_data(data):
    if data:
    # ここでIndentationErrorが発生する場合、
    # 次の行が正しくインデントされているか確認
        print("Data available")
    else:
        print("No data") # この行のインデントも確認

防止策とベストプラクティス

信頼できるIDE(VS Code, PyCharmなど)を使用し、インデントを自動的に処理する機能や、タブをスペースに変換する設定を有効にしましょう。また、Pythonのリンター(Flake8, Pylintなど)を導入することで、インデントエラーを早期に検出できます。

# IDEが自動でインデントしてくれる例
def example_function():
    # カーソルをここに置きEnterを押すと、次の行が自動でインデントされる
    print("Inside function")
コードエディタの設定で「タブをスペースに変換する」オプションを有効にし、インデント幅を4スペースに設定することで、この種のエラーを劇的に減らすことができます。

よくある質問(FAQ)

Q
IndentationErrorはなぜPython特有のエラーなのですか?
A

Pythonはコードブロックの構造をインデントによって定義する数少ない言語の一つだからです。他の多くの言語では、ブレース({})やキーワード(end)を使ってブロックを区切りますが、Pythonはインデントの深さに意味を持たせています。

Q
タブとスペースの混在はどのように確認できますか?
A

多くのIDEには、空白文字を表示する機能があります(例: VS Codeの「Render Whitespace」)。これにより、タブとスペースの違いを視覚的に確認できます。また、flake8などのリンターもこの問題を検出します。

Q
空のコードブロックが必要な場合はどうすれば良いですか?
A

コードブロックが意図的に空である場合は、passステートメントを使用します。passは何もしないヌル操作で、Pythonに「このブロックは意図的に空である」と伝えます。

免責事項: 当記事の情報は執筆時点の内容に基づいています。最新情報は各公式サイトをご確認ください。当サイトは情報提供を目的としており、資格取得・技術的対応の結果について一切の責任を負いません。

コメント

タイトルとURLをコピーしました