Code Fix

初級

Python 2のprint文をPython 3で使った原因と直し方

Python 2の書き方(print文)をPython 3で使うと出るエラーです。printが「文」から「関数」に変わったことが原因です。

エラーメッセージの読み方

  File "main.py", line 2
main.py
ファイル名
2
行番号 — Pythonが構文解析を諦めた位置
SyntaxError
エラークラス — 実行前の構文チェックで検出されました
Missing parentheses in call to 'print'. Did you mean print(...)?
内容 — 期待していたもの、または見つけられなかったもの

このエラーが出る典型パターン

パターン1

 1  message = "hello"
 2  print message 
             ^
File "main.py", line 2 print message ^^^^^^^^^^^^^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?

Python 2ではprintは文でしたが、Python 3では関数です。関数として呼び出すには括弧が必要です。

直し方: message を (message) にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  name = "Tom"
 2  age = 20
 3  print name, age 
              ^
File "main.py", line 3 print name, age ^^^^^^^^^^^^^^^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?

複数の値を渡す場合もカンマの前に括弧が必要です。カンマだけでは関数呼び出しになりません。

直し方: name, age を (name, age) にします。

この問題を解いてみる →

パターン3

 1  score = 90
 2  print "Score:", score 
                 ^
File "main.py", line 2 print "Score:", score ^^^^^^^^^^^^^^^^^^^^^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?

文字列と変数を混ぜて表示する場合も同じです。printの後には必ず丸括弧で引数をまとめます。

直し方: "Score:", score を ("Score:", score) にします。

この問題を解いてみる →

パターン4

 1  items = [1, 2, 3]
 2  print items 
            ^
File "main.py", line 2 print items ^^^^^^^^^^^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?

リストを渡す場合も同じです。printの後には必ず丸括弧が要ります。

直し方: items を (items) にします。

この問題を解いてみる →

パターン5

 1  temp = 25
 2  print temp, "C" 
              ^
File "main.py", line 2 print temp, "C" ^^^^^^^^^^^^^^^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?

複数の値と文字列を混ぜて表示する場合も、丸括弧でまとめて渡します。

直し方: temp, "C" を (temp, "C") にします。

この問題を解いてみる →

よくある誤解

自分で書いたコードでは起きにくく、古い書籍やネット上の情報をそのまま写したときに多発します。Python 2時代の情報はまだ大量に残っています。

実務での勘所

printが文から関数に変わったのは、単なる見た目の変更ではありません。関数であれば、sepやend、fileといったキーワード引数を自然に渡せるようになり(print(a, b, sep=", ")のように)、必要なら他の関数に引数として渡すこともできます。文のままではこうした柔軟な拡張ができませんでした。Python 2の後期バージョンには、この変更を先取りして使えるfrom __future__ import print_functionという移行用の仕組みが用意されており、当時はこれを使って両方のバージョンで動くコードを書くのが一般的でした。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)