Python “expected an indented block” エラー4つの原因・解決策

Pythonで時折こういうエラーに遭遇します。

▼ このようなエラーが発生

File "launcher.py", line 170
class WebEnginePage(QWebEnginePage):
^
IndentationError: expected an indented block

IndentationError : expected an indented block

Pythonを使ってると頻繁に起こりがちです。

このエラーの典型的な原因パターンを挙げます。
しょうもない原因だけど意外とハマりがちです。

原因1.インデントの不足・不一致によるエラー

ご存じの通り、Pythonには次の絶対ルールがあります

  • ブロックはインデントで定義する
  • インデントは空白またはタブ

つまり関数だったりif文・for文とかのステートメントだったり……そういうコード的な塊を「ブロック」というのですが、Pythonではインデントで定義します。

だから不正なインデントを探すのが第一歩です。

▼ 例えば関数定義でこうやるとエラー

▼ IndentationError発生

関数内では、その中身をインデントしないとダメ。

この間違ったコードは次のように修正できます。

▼ 修正した正しい期待通りのコード

Pythonのインデントはただの飾りじゃありません!

それが他言語と大違いなことです(欠陥とも呼ばれがち…)

if文・for文などでもインデントの不一致に注意

それから普通のif文・for文などもそうです。

▼ 例えばif文などでインデントが抜けてる場合

▼ IndentationError発生

まずインデントが正しいかを確認すべきです。

インデントエラーが見つけにくいパターンもある

先ほどの例では明確にインデントエラーと分かります。

でもインデントが原因と分かりにくいケースも…

▼ 例えばこのようなコードがあるとする

▼ IndentationErrorではなくTypeError発生

このパターンも厄介ですね。

単純にインデントが不正なだけなのにTypeErrorが出るから「え?渡してる引数がマズいの?」「引数はnumberのはずだけど…」みたいに思考を混乱させます。

エラーの原因がどう考えても不明な時、

その時はインデントエラーも疑うべきなのかも

原因2.空関数・空メソッドなのにpassしていないから

例えば関数・メソッドを定義した時、

  • とりあえず名前だけ定義しておきたい
  • だから中身は一切ないし未定義

そういう時にもインデントエラーが起こります。

▼ 例えばこのようなコード

▼ いつものIndentationError発生

他言語に慣れてる人からすると不思議です。

Python以外だったら空関数・空メソッドがあってもエラーにならないし、Pythonインタープリターは問題のあるhoge関数ではなくfuga関数に向けてIndentationErrorを指摘するからです。

中身がない空関数があるなら pass すればエラー解決

もしPythonで中身が空の関数を定義するなら…

「必ず pass を使って何もしないことを明示すべき」

先ほどのコード例ならこのように修正します。

▼ 空関数内では必ず pass すること

知らない人からしたらドツボにハマりがち

気を付けるべきポイントです。

原因3.空のクラス定義時にpassしていないから

中身のない空クラスでも同じことは起こります。

  • とりあえず名前だけでクラスを定義
  • クラスの中身を一切書かない

そういう例をすこし考えてみます、

▼ 空クラスの間違った定義コード例

▼ IndentationError発生

これも空関数・空メソッドの場合と同じです。

中身無し空クラスでも pass すればエラー解決

中身が空なら pass してあげないといけません。

▼ つまり先ほどのコードはこう修正する

分かってると本当にしょうもないこと

だけど原因を知らないと悩み続けてしまいます。

原因4.中身がないif文・for文・while文・その他…

もちろん中身がないブロックなら pass が必要です。

  • 中身がないif文
  • 中身がないfor文・while文
  • 中身がないwith open文
  • 中身がないtry except文
  • 中身がない他ステートメント

こういった中身がないブロックも大敵ですね。

ただ空メソッド・空クラスより発生頻度は低いはず

対処方法は pass で何もしないと明示するだけでOKです。

まとめ.インデントエラーの原因・解決策一覧

ここまでを簡単に箇条書き

基本的にはインデントの不足・不一致が原因です。

残りは空ブロックでpassし忘れないか確認

以上、PythonでIndentationError解決策でした。ではまた

Shareこの記事をシェアしよう!

Commentsこの記事についたコメント

2件のコメント
  • いなぴょん

    If文の処理が空欄の時にpassが必要なのを知らず、インデントの位置は間違っていないのにelse:のインデントエラーが出て悩んでいました。
    今までエラーなど出ずに使用できていたので急にこうなったのが不思議ですが、ヒントを検索していたらこちらの記事に辿り着きやっと解決できました。
    大変ありがとうございました!!

    11月 11, 2022 10:18 am
    • ぴー助

      記事内容がお役に立ったようで嬉しいです。
      コメントありがとうございました!

      11月 11, 2022 6:20 pm

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください