Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

SyntaxError: unexpected EOF while parsingの読み解き方と解決方法を紹介します

f:id:nana_yu:20181106121329p:plain

こんにちは。PyQチームのnao_yです。

このPythonお悩み解決では、SyntaxErrorの原因とエラーの読み解き方を紹介します。

SyntaxErrorとは?

SyntaxErrorはプログラムがPythonの文法として正しくないときに発生するエラーです。

今回は関数やメソッドを使うときに起こるエラーに焦点を当てます。

エラー例

関数やメソッドを使うときにこのようなエラーが起きたことはないでしょうか?

# sample.py
text = 'Hello, Python!'
print(text, len(text)
# ここは空行ですが、わかりにくいのでコメントを入れています
  File "sample.py", line 4

                         ^
SyntaxError: unexpected EOF while parsing

エラーメッセージ

関数やメソッドの括弧を閉じ忘れているとSyntaxError: unexpected EOF while parsingというエラーメッセージが表示されます。

これは「プログラムの解析中にファイルの末尾までたどり着いてしまった」という意味です。

エラーを読み解きながら、原因と発生する仕組みを確認します。

エラーを読み解こう

SyntaxError: unexpected EOF while parsingが発生したとき、Pythonがどのような動作をしているか確認していきましょう。

以下はエラーがあるコードです。

# sample.py
text = 'Hello, Python!'
print(text, len(text)
# ここは空行ですが、わかりにくいのでコメントを入れています

このコードのエラーの原因は、print関数の括弧が閉じられていないことです。

解決自体はとても簡単です。print関数に閉じ括弧)をつけるだけです。

エラーを解決したコードを見ながら、エラーが発生する仕組みを理解してみましょう。

以下がエラーを解消したコードです。

# sample.py
text = 'Hello, Python!'
print(text, len(text))
# ここは空行ですが、わかりにくいのでコメントを入れています

コードが正しく書かれているとき、実行順はこのようになります。

  1. Pythonがコードを解釈する
  2. 変数textに文字列 'Hello, Python!' を代入する
  3. print関数を見つける
  4. print関数の引数 len(text) を実行する
  5. 変数textの文字列とlen(text)で求めた文字列の長さが表示される

f:id:nao_y_py:20181005174906p:plain

では、次にコードに文法ミスがあるときに動きを見てみましょう。

f:id:nao_y_py:20181005171645p:plain

Pythonはまず人間が書いたコード全体を解釈します。SyntaxErrorはこの段階で発生するエラーです。

Pythonは始め括弧(を見つけると、それに対応する閉じ括弧を探します。

2行目のprint関数の始め括弧に対応する閉じ括弧が同じ行に見つからないとき、Pythonは3行目の空行まで閉じ括弧を探します。 そこまで探して見つからないと、エラーを発生させます。これがSyntaxError: unexpected EOF while parsingが発生する仕組みです。

なお、閉じ括弧が不足している処理の後に他の処理がある場合は、別のエラーSyntaxError: invalid syntaxが発生します。 こちらのエラーを見かけることの方が多いかもしれません。

以上がSyntaxError: unexpected EOF while parsingの解決法と発生する仕組みの説明です。

PyQのエディターをはじめとして、多くのエディターには始め括弧を入力すると閉じ括弧を補完する機能があります。とはいえ、プログラムを書いているときにうっかり閉じ括弧を消してしまってエラーが出ることもあるかもしれません。そんなときには落ち着いてエラーが発生している行の付近を観察して、原因を見つけましょう。

Copyright ©2017- BeProud Inc. All rights reserved.