Python2コードをPython3に移植する方法
序章
Pythonは1980年代後半に開発され、1991年に最初に公開されました。 英国のコメディグループであるモンティパイソンにちなんで名付けられたPythonは、必須の汎用ABCプログラミング言語の後継として考案されました。 最初の反復では、Pythonにはすでに例外処理、関数、および継承を持つクラスが含まれていました。
このチュートリアルでは、Python2からPython3にコードを移行する際のベストプラクティスと考慮事項、および両方のバージョンと互換性のあるコードを維持する必要があるかどうかについて説明します。
バックグラウンド
Python 2 は2000年に公開され、より透過的で包括的な言語開発プロセスを示しています。 より多くのプログラム機能が含まれ、開発全体を通じてさらに多くの機能が追加されました。
Python 3 は、Pythonの未来と見なされており、現在開発中の言語のバージョンです。 2008年後半にリリースされたPython3は、固有の設計上の欠陥に対処して修正しました。 ただし、Python 2との下位互換性がないため、Python3の採用は遅れています。
Python 2.7 は、2.xリリースの最後として2010年に公開されました。 Python 2.7の背後にある意図は、Python2.xユーザーがPython3に機能を移植しやすくすることで、2つの間にある程度の互換性を提供することでした。
チュートリアル「Python2とPython3:実用上の考慮事項」を読むことで、Pythonのバージョンと使用するバージョンの選択について詳しく知ることができます。
Python2.7から始める
Python 3に移行する、またはPython2とPython3を同時にサポートするには、Python2コードがPython2.7と完全に互換性があることを確認する必要があります。
多くの開発者はすでにPython2.7コードのみを使用していますが、以前のバージョンでのみサポートされているものがPython 2.7で正しく機能し、Python2.7スタイルと一致していることを確認することが重要です。
コードがPython2.7であることを確認することは特に重要です。これは、Python 2がまだ維持されており、バグ修正を受けている唯一のバージョンであるためです。 以前のバージョンのPython2で作業している場合は、サポートされなくなり、buxfixesを受け取らなくなったコードで発生する問題を回避する必要があります。
さらに、プログラミングエラーを探す Pylint パッケージなど、コードの移植を容易にする一部のツールは、2.7より前のバージョンのPythonではサポートされていません。
Python 2.7は現在もサポートおよび保守されていますが、最終的にはサポートが終了することを覚えておくことが重要です。 PEP 373 は、Python 2.7のリリーススケジュールの詳細を示しており、執筆時点では、その廃止日を2020としています。
テストカバレッジ
テストケースの作成は、Python2をPython3コードに移行するために行われる作業の重要な部分になる可能性があります。 Pythonの複数のバージョンを維持している場合は、各バージョンが引き続き期待どおりに機能することを保証するために、テストスイートが全体的に良好なカバレッジを持っていることも確認する必要があります。
テストの一環として、インタラクティブなPythonケースをすべての関数、メソッド、クラス、モジュールのdocstringに追加し、組み込みの doctestモジュールを使用して、それらが図のように機能することを確認できます。
doctest
と一緒に、coverage.pyパッケージを使用して単体テストのカバレッジを追跡できます。 このツールはプログラムを監視し、コードのどの部分が実行されたか、どの部分が実行されたが実行されなかったかを記録します。 coverage.py
は、コマンドラインにレポートを印刷したり、HTML出力を提供したりできます。 これは通常、テストの有効性を測定するために使用され、コードのどの部分がテストによって実行され、どの部分が実行されていないかを示します。
100%のテストカバレッジを目指しているのではないことに注意してください。混乱したり、異常なコードをカバーしていることを確認する必要があります。 ベストプラクティスについては、80% cの超過を目指す必要があります。
Python2とPython3の違いについて学ぶ
Python2とPython3の違いについて学ぶことで、Python3で利用できる、または利用できるようになる新機能を確実に活用できるようになります。
「Python2とPython3」に関するガイドでは、2つのバージョン間の主な違いの一部について説明しています。詳細については、公式Pythonドキュメントをご覧ください。詳細。
移植と移行を開始するとき、今実装できる構文の変更がいくつかあります。
print
The print
Python2のステートメントがに変更されました print()
Python3の関数。
Python 2 | Python 3 |
---|---|
print "Hello, World!" |
print("Hello, World!") |
exec
The exec
Python 2のステートメントは、Python3で明示的なローカルとグローバルを許可する関数に変更されました。
Python 2 | Python 3 |
---|---|
exec code |
exec(code) |
exec code in globals |
exec(code, globals) |
exec code in (globals, locals) |
exec(code, globals, locals) |
/
および//
Python 2は、 /
演算子、Python3が導入されました //
フロア分割用。
Python 2 | Python 3 |
---|---|
5 / 2 = 2 |
5 / 2 = 2.5 |
5 // 2 = 2 |
Python 2でこれらの演算子を使用するには、__future__
モジュールからimport division
を実行します。
from __future__ import division
整数による除算の詳細をご覧ください。
raise
Python 3では、引数を使用して例外を発生させるには括弧が必要であり、文字列を例外として使用することはできません。
Python 2 | Python 3 |
---|---|
raise Exception, args |
raise Exception |
raise Exception(args) |
|
raise Exception, args, traceback |
raise Exception(args).with_traceback(traceback) |
raise "Error" |
raise Exception("Error") |
except
Python 2では、複数の例外をリストすることは困難でしたが、Python3ではそれが変更されました。
ご了承ください as
で明示的に使用されます except
Python3で
Python 2 | Python 3 |
---|---|
except Exception, variable: |
except AnException as variable: |
except (OneException, TwoException) as variable: |
def
Python 2では、関数はタプルやリストのようなシーケンスを受け取ることができます。 Python 3では、この解凍は削除されました。
Python 2 | Python 3 |
---|---|
def function(arg1, (x, y)): |
def function(arg1, x_y): x, y = x_y |
expr
Python2のバックティック構文はもう存在しません。 使用する repr()
また str.format()
Python3で。
Python 2 | Python 3 |
---|---|
x = `355/113` |
x = repr(355/113): |
文字列のフォーマット
文字列のフォーマット構文がPython2からPython3に変更されました。
Python 2 | Python 3 |
---|---|
"%d %s" % (i, s) |
"{} {}".format(i, s) |
"%d/%d=%f" % (355, 113, 355/113) |
"{:d}/{:d}={:f}".format(355, 113, 355/113) |
Python3で文字列フォーマッターを使用する方法を学びます。
class
述べる必要はありません object
Python3で。
Python 2
class MyClass(object):
pass
Python 3
class MyClass:
pass
Python 3では、メタクラスは metaclass
キーワード。
Python 2
class MyClass:
__metaclass__ = MyMeta
class MyClass(MyBase):
__metaclass__ = MyMeta
Python 3
class MyClass(metaclass=type):
pass
class MyClass(MyBase, metaclass=MyMeta):
pass
コードを更新
Python 2との互換性を維持しながら、コードをPython3に自動的に更新するために使用できる2つの主要なツールがあります。futureとmodernize。 これらのツールはそれぞれ動作が多少異なります。future
はPython3のイディオムを作成するために機能し、ベストプラクティスはPython 2に存在しますが、modernize
はPythonを使用するPythonのPython2/3サブセットを対象としています[ X204X]互換性を向上させるための6つのモジュール