あるある
Pythonのプログラムを落としてきて実行したら
SyntaxError: Missing parentheses in call to ‘print’. Did you mean print(‘ABC’)?
だの
NameError: name ‘xrange’ is not defined
だの出て「Python2かよ!」となることは多々あると思います。
そういう事態に遭遇したとき小手先で移植することが多いので、ノウハウ(と呼べるかもわからないほどの)テクニックをまとめました。
使用例:https://github.com/OLIET2357/strong-qr-decoder/commit/2a28284b4d16398b7a6c5933489bddd9c33f951a
なお割と最近知ったのですが、Python3には2to3
というまさにそれをする標準ライブラリが含まれています。
あくまで手軽に直したいときや、2to3
を使えない・使っても治らなかった場合に試してみてください。
“print ‘ABC’” を “print(‘ABC’)” にする
“xrange” を “range” にする
“izip” を “zip” にする
Python2からPython3最大の非互換です。ここは機械的に直しましょう。警告出て実行できてもいいのよ。置換の正規表現はその場で書くので覚えてません。
後は実行してみてエラーで落ちたらその都度それっぽい修正を適用します。
“.encode()” や “.decode()” をつけてみる
Python3から仕様が変わったのでしょうか(未調査)。bytearray周りやエンコーディング関係でエラーが起きたら付けてみたら治りがちです。
“range(…)” や “map(…)” を “list”で囲む
これはPython3からパフォーマンスのため、range()やmap()関数がlistオブジェクトではなくrangeやmapオブジェクトを返すようになったため、listであるとして扱っているPython2プログラムが落ちます。落ちた行に原因があるとも限らないうえパフォーマンスより動くことを優先するならば、全てのrangeやmapに付けてもよいでしょう。
実例が増えたら追記します。