目次
概要
Pythonを2系から3系にアップデートする際に、2系と3系は互換性のない部分が多いので、コードの修正が必要な場合もある。
これは大きな障壁となり得るが、コードを自動で変換してくれる便利なツールがいくつか提供されている。
ここではその中でも使いやすそうな、2to3 と futurizeを比較してみる。
2to3とfuturizeの違い
この2つはそれぞれ大きく異なる部分があるため、この記事ではその違いについてのみ説明する。
この記事を読んで、自分の環境ではどちらが合うのかの判断材料となることを目的とする。
それぞれの詳細な使い方については以下で書いているので、よければ参考にしてください。
2to3とは
Pythonに標準で同梱されているモジュール。
2系のソースを3系用に自動で書き換えてくれる。
自分で変換プログラムを書くこともできる。
こちらは、futurizeと比べるとシンプルなツールとなっている。
futurize
2to3をベースとして作られており、2系のソースを3系用に自動で書き換えてくれるモジュール。
2to3との違いは、こちらはソースコードをPython2系3系のどちらでも動くように、futureモジュールを組み込むため、2to3を使った場合とは異なる実装となる。
参考:Automatic conversion to Py2/3
2to3とfuturizeの具体的な違い
では、2to3とfuturizeで、実装される内容が具体的にどのように異なるのかを検証する。
サンプルコード
以下のコードを使い、2to3とfuturizeそれぞれで変換し、実行結果を検証してみる。
Python2系と3系では以下の割り算の結果が異なるため、以下のコードを実行すると、2系では0
、3系では0.5
が返る。
参考:Python2系と3系の違い - 割り算の少数点以下の扱いについて
# -*- coding:utf-8 -*-
print(1/2)
2to3で変換をした場合
2to3で変換した場合、以下の用に変換される。(ほぼ差分はなし)
# -*- coding:utf-8 -*-
print((1/2))
変換後のコードを2系で実行
$ python sample.py
0
変換後のコードを3系で実行
$ python sample.py
0.5
当然、2系と3系での実行結果は異なるものとなった。
futurizeで変換した場合
futurizeのstage2でのコード変換をした場合は、以下の実装に変換される。
# -*- coding:utf-8 -*-
from __future__ import print_function
from __future__ import division
from past.utils import old_div
print(old_div(1,2))
変換後のコードを2系で実行
$ python sample.py
0
変換後のコードを3系で実行
$ python sample.py
0
変換後のコードを、2系、3系のどちらで実行しても同じ結果が返るように実装された。
その他の違い
futurizeではstageという概念があり、2段階でコードを2系から3系へアップデートすることを理想としている。一気に変更するより、2段階で行う事でリスクを回避することを目的としている。
それに対して、2to3では段階を踏むという概念はない。2to3のほうがシンプルとも言える。
futurizeのstageの詳細は以下を参照。
参考:futurizeのstageについて
まとめ
このようにfuturizeと2to3では、実装内容だけでなく実行結果、またコード変換の方法や概念も異なる。
環境によってどちらを利用すべきか判断は異なると思うので、それぞれのツールの違いを把握した上で決めることが望ましい。