Python 2からPython 3へのコードの移行は、多くの開発者にとって避けて通れない課題です。Python 2のサポートは2020年1月1日に終了し、Python 3が今後の標準となっています。この記事では、Python 2のコードをPython 3に完全に移行する方法を包括的に解説します。
1. Python 2とPython 3の違いを理解する
まず、Python 2とPython 3の主な違いを理解することが重要です。これには、構文や組み込み関数、標準ライブラリなどの違いが含まれます。以下に代表的な違いをいくつか挙げます。

-
文字列の取り扱い
Python 2では、str
はバイト列で、unicode
はユニコード文字列を扱います。Python 3では、str
がユニコード文字列を扱い、バイト列はbytes
という型で表現されます。 -
除算の違い
Python 2では、整数同士の除算は整数を返します(例えば、5 / 2
は2
)。Python 3では、整数同士の除算でも浮動小数点数を返します(5 / 2
は2.5
)。 -
print
文
Python 2では、print
は文(statement)であり、括弧は必須ではありません。Python 3では、print
は関数であり、常に括弧が必要です。
これらの違いを意識しながら、コードの移行を進めていきます。
2. 2to3
ツールを使用する
Pythonには、Python 2のコードをPython 3に変換するためのツール2to3
があります。このツールは、構文的な変更を自動で変換するため、非常に便利です。
使い方
2to3
は、Python 2で書かれたソースコードをPython 3に変換します。次のコマンドをターミナルで実行することで、コードを変換できます。
bash2to3 my_script.py
これにより、my_script.py
がPython 3の文法に変換されます。変換結果は標準出力に表示され、変更内容を確認できます。変換を実際にファイルに適用するには、-w
オプションを追加します。
bash2to3 -w my_script.py
これで、my_script.py
がPython 3に対応したコードに書き換えられます。
注意点
-
2to3
は主に構文変更を行いますが、ライブラリの非互換性や、細かい動作の違いについては対応していないことがあります。手動で修正が必要な場合があります。
3. 文字列の取り扱いの変更
Python 2からPython 3に移行する際の大きな変更点の1つが、文字列の扱いです。Python 2ではstr
型がバイト列として扱われ、unicode
型がユニコード文字列として扱われていました。しかし、Python 3ではstr
型がユニコード文字列となり、バイト列はbytes
型として扱われます。
修正方法
-
文字列リテラルを
u
プレフィックスで定義している場合(例えば、u"文字列"
)、Python 3ではこのプレフィックスは不要です。Python 3ではデフォルトで文字列がユニコードとなります。 -
バイト列を使用する場合は、
b
プレフィックスを付けて定義します(例:b"バイト列"
)。
python# Python 2
s = u"Hello"
b = "Hello"
# Python 3
s = "Hello"
b = b"Hello"
4. print
文の変更
Python 2では、print
は文として使われていたため、括弧なしで書くことができました。しかし、Python 3ではprint
は関数に変更され、常に括弧が必要です。
修正方法
すべてのprint
文を関数形式に変更します。
python# Python 2
print "Hello, World!"
# Python 3
print("Hello, World!")
5. 除算の変更
Python 2では、整数同士の除算は整数の結果を返しました。これにより、整数型の除算が切り捨てられることがありました。Python 3では、整数同士の除算でも浮動小数点数を返すようになりました。整数の除算を整数にしたい場合は、//
演算子を使用します。
修正方法
整数同士の除算を行う場合、//
を使って整数の商を得るようにします。
python# Python 2
result = 5 / 2 # 2
# Python 3
result = 5 // 2 # 2
6. xrange
の変更
Python 2では、xrange
はメモリ効率の良いrange
の代替として使用されていましたが、Python 3ではxrange
は削除され、range
がそのままメモリ効率の良いイテラブルとして機能します。
修正方法
xrange
をrange
に置き換えます。
python# Python 2
for i in xrange(10):
print(i)
# Python 3
for i in range(10):
print(i)
7. モジュールの変更
Python 3では、いくつかのモジュールが名前変更されたり、非推奨になったりしました。例えば、urllib
モジュールはPython 3で名前が変更され、urllib.request
、urllib.parse
、urllib.error
などに分割されました。
修正方法
Python 2のモジュールをPython 3対応に変更する必要があります。
python# Python 2
import urllib
# Python 3
import urllib.request
import urllib.parse
8. 依存ライブラリの対応
Python 2からPython 3に移行する際には、依存している外部ライブラリやパッケージがPython 3に対応しているか確認することが重要です。多くの人気パッケージはPython 3に対応していますが、古いバージョンのライブラリを使用している場合は、最新バージョンにアップデートするか、Python 3に対応した代替ライブラリを使用することを検討してください。
9. テストとデバッグ
移行後のコードは、しっかりとテストする必要があります。Python 2とPython 3では微妙な挙動の違いがあるため、テストを実行して予期しない動作がないか確認しましょう。また、unittest
やpytest
などのテストフレームワークを使用して、移行前後の挙動が一致することを確認することが重要です。
10. まとめ
Python 2からPython 3への移行は、時間と労力がかかる作業ですが、Python 3の新機能や性能向上を活かすためには避けて通れません。移行を進める際は、2to3
ツールを活用し、文字列処理やprint
文、除算などの変更を反映させることが重要です。また、依存ライブラリやモジュールの変更にも注意を払い、テストをしっかりと行いましょう。
移行後は、Python 3の利点を最大限に活用できるようになりますので、早めに移行を完了させ、最新のPython環境での開発を楽しんでください。