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ではインデントで定義します。
だから不正なインデントを探すのが第一歩です。
▼ 例えば関数定義でこうやるとエラー
1 2 3 |
def hoge(): ## Print "hello" print("hello") |
▼ IndentationError発生
1 2 3 4 |
File "main.py", line 6 print("hello") ^ IndentationError: expected an indented block |
関数内では、その中身をインデントしないとダメ。
この間違ったコードは次のように修正できます。
▼ 修正した正しい期待通りのコード
1 2 3 |
def hoge(): ## Print "hello" print("hello") |
Pythonのインデントはただの飾りじゃありません!
それが他言語と大違いなことです(欠陥とも呼ばれがち…)
if文・for文などでもインデントの不一致に注意
それから普通のif文・for文などもそうです。
▼ 例えばif文などでインデントが抜けてる場合
1 2 3 4 5 6 7 8 9 10 |
a = True b = True if(a): print("a is True") if(b): print("b is True") ## <= エラー else: print("b is False") else: print("a is False") |
▼ IndentationError発生
1 2 3 4 |
File main.py", line 9 print("b is True") ^ IndentationError: expected an indented block |
まずインデントが正しいかを確認すべきです。
インデントエラーが見つけにくいパターンもある
先ほどの例では明確にインデントエラーと分かります。
でもインデントが原因と分かりにくいケースも…
▼ 例えばこのようなコードがあるとする
1 2 3 |
def print_sum(a,b): sum = a+b print("sum = %d" % sum) |
▼ IndentationErrorではなくTypeError発生
1 2 3 4 |
Traceback (most recent call last): File "Main.py", line 6, in <module> print("sum = %d" % sum) TypeError: %d format: a number is required, not builtin_function_or_method |
このパターンも厄介ですね。
単純にインデントが不正なだけなのにTypeErrorが出るから「え?渡してる引数がマズいの?」「引数はnumberのはずだけど…」みたいに思考を混乱させます。
エラーの原因がどう考えても不明な時、
その時はインデントエラーも疑うべきなのかも
原因2.空関数・空メソッドなのにpassしていないから
例えば関数・メソッドを定義した時、
- とりあえず名前だけ定義しておきたい
- だから中身は一切ないし未定義
そういう時にもインデントエラーが起こります。
▼ 例えばこのようなコード
1 2 3 4 5 |
def hoge(): ## Not implemented def fuga(): print("hello") |
▼ いつものIndentationError発生
1 2 3 4 |
File "main.py", line 7 def fuga(): ^ IndentationError: expected an indented block |
他言語に慣れてる人からすると不思議です。
Python以外だったら空関数・空メソッドがあってもエラーにならないし、Pythonインタープリターは問題のあるhoge関数ではなくfuga関数に向けてIndentationErrorを指摘するからです。
中身がない空関数があるなら pass すればエラー解決
もしPythonで中身が空の関数を定義するなら…
「必ず pass を使って何もしないことを明示すべき」
先ほどのコード例ならこのように修正します。
▼ 空関数内では必ず pass すること
1 2 3 4 5 6 |
def hoge(): ## Not implemented pass def fuga(): print("hello") |
知らない人からしたらドツボにハマりがち
気を付けるべきポイントです。
原因3.空のクラス定義時にpassしていないから
中身のない空クラスでも同じことは起こります。
- とりあえず名前だけでクラスを定義
- クラスの中身を一切書かない
そういう例をすこし考えてみます、
▼ 空クラスの間違った定義コード例
1 2 3 4 |
class Hoge: ## NotImplemented hoge = Hoge() |
▼ IndentationError発生
1 2 3 4 |
File "main.py", line 7 hoge = Hoge() ^ IndentationError: expected an indented block |
これも空関数・空メソッドの場合と同じです。
中身無し空クラスでも pass すればエラー解決
中身が空なら pass してあげないといけません。
▼ つまり先ほどのコードはこう修正する
1 2 3 4 5 |
class Hoge: ## NotImplemented pass hoge = Hoge() |
分かってると本当にしょうもないこと
だけど原因を知らないと悩み続けてしまいます。
原因4.中身がないif文・for文・while文・その他…
もちろん中身がないブロックなら pass が必要です。
- 中身がないif文
- 中身がないfor文・while文
- 中身がないwith open文
- 中身がないtry except文
- 中身がない他ステートメント
こういった中身がないブロックも大敵ですね。
ただ空メソッド・空クラスより発生頻度は低いはず
対処方法は pass で何もしないと明示するだけでOKです。
まとめ.インデントエラーの原因・解決策一覧
ここまでを簡単に箇条書き
基本的にはインデントの不足・不一致が原因です。
残りは空ブロックでpassし忘れないか確認
以上、PythonでIndentationError解決策でした。ではまた