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 ^
Python 2ではprintは文でしたが、Python 3では関数です。関数として呼び出すには括弧が必要です。
直し方: message を (message) にします。
パターン2
1 name = "Tom" 2 age = 20 3 print name, age ^
複数の値を渡す場合もカンマの前に括弧が必要です。カンマだけでは関数呼び出しになりません。
直し方: name, age を (name, age) にします。
パターン3
1 score = 90 2 print "Score:", score ^
文字列と変数を混ぜて表示する場合も同じです。printの後には必ず丸括弧で引数をまとめます。
直し方: "Score:", score を ("Score:", score) にします。
パターン4
1 items = [1, 2, 3] 2 print items ^
リストを渡す場合も同じです。printの後には必ず丸括弧が要ります。
直し方: items を (items) にします。
パターン5
1 temp = 25 2 print temp, "C" ^
複数の値と文字列を混ぜて表示する場合も、丸括弧でまとめて渡します。
直し方: temp, "C" を (temp, "C") にします。
よくある誤解
自分で書いたコードでは起きにくく、古い書籍やネット上の情報をそのまま写したときに多発します。Python 2時代の情報はまだ大量に残っています。
実務での勘所
printが文から関数に変わったのは、単なる見た目の変更ではありません。関数であれば、sepやend、fileといったキーワード引数を自然に渡せるようになり(print(a, b, sep=", ")のように)、必要なら他の関数に引数として渡すこともできます。文のままではこうした柔軟な拡張ができませんでした。Python 2の後期バージョンには、この変更を先取りして使えるfrom __future__ import print_functionという移行用の仕組みが用意されており、当時はこれを使って両方のバージョンで動くコードを書くのが一般的でした。