Python2からPython3への小手先の移植


あるある

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に付けてもよいでしょう。

実例が増えたら追記します。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です