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この記事についたコメント

コメントを残す

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

CAPTCHA


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