こんにちは。PyQチームのnao_yです。
このPythonお悩み解決では、SyntaxError
の原因とエラーの読み解き方を紹介します。
SyntaxErrorとは?
SyntaxError
はプログラムがPythonの文法として正しくないときに発生するエラーです。
今回は文字列を表現するときに起こるエラーに焦点を当てます。
エラー例
文字列を定義するときにこのようなエラーが起きたことはないでしょうか?
# sample.py text = 'Hello, Python! print(text)
File "sample.py", line 2 text = 'Hello, Python! ^ SyntaxError: EOL while scanning string literal
エラーメッセージ
文字列の定義に文法ミスがあるときはSyntaxError: EOL while scanning string literal
というエラーメッセージが表示されます。
このメッセージを訳すと「文字列リテラルをスキャンしている間に行末が来てしまった」という意味になります。
文字列リテラルとはどういうものなのでしょうか。
文字列リテラル
文字列リテラルとは、シングルクォート'
やダブルクォート"
で括られた文字列のことを指します。
string_literal1 = 'Python' string_literal2 = "PyQ"
エラーを読み解こう
以下がエラーがあるコードです。
# sample.py text = 'Hello, Python! print(text)
文字列がシングルクォート'
で閉じられていないことがエラーの原因ですが、エラーメッセージの意味と合わせて考えてみましょう。
エラーメッセージの意味は文字列リテラルをスキャンしている間に行末が来てしまった
ということでした。
Pythonはプログラムを左から右へ読み込んで、処理を解釈します。
このコードが正しく書かれていた場合の解釈は以下のようになります。
- Pythonがコードを解釈する
- 変数
text
を作る - 文字列リテラルを順に読み込む
- 文字列リテラル 'Hello, Python!' を変数textに代入する
- 変数
text
を表示する
Pythonはまず人間が書いたコード全体を解釈します。これが1番の処理です。SyntaxErrorはこの段階で発生するエラーです。
このとき、文字列リテラルの開始を見つけると行末まで対応する記号(シングルクォートまたはダブルクォート)を探します。
行末まで記号が見つからない場合にSyntaxError: EOL while scanning string literal
というエラーが発生します。
シングルクォートで始まった文字列リテラルはシングルクォートで閉じなければならないので、シングルクォートとダブルクォートが混じった文字列リテラルも同様のエラーになります。
text = 'Hello, Python!"
文字列リテラルの定義に使う記号(シングルクォートまたはダブルクォート)は必ず統一しましょう。