前書き

Pythonは1980年代後半に開発され、1991年に最初に公開されました。 英国のコメディグループMonty Pythonに触発された名前で、Pythonは命令型汎用ABCプログラミング言語の後継者として考案されました。 Pythonは最初の反復で、例外処理、https://www.digitalocean.com/community/tutorials/how-to-define-functions-in-python-3 [functions]、およびhttps://www.digitaloceanを既に含んでいます。 .com / community / tutorials / understanding-inheritance-in-python-3 [継承のあるクラス]。

このチュートリアルでは、コードをPython 2からPython 3に移行する際のベストプラクティスと考慮事項、および両方のバージョンと互換性のあるコードを維持する必要があるかどうかについて説明します。

バックグラウンド

  • Python 2 *は2000年に公開され、より透明で包括的な言語開発プロセスを示しています。 さらに多くのプログラム機能が含まれており、開発中に機能が追加されました。

  • Python 3 *はPythonの未来と見なされており、現在開発中の言語のバージョンです。 2008年後半にリリースされたPython 3は、本質的な設計上の欠陥に対処し、修正しました。 ただし、Python 2との後方互換性がないため、Python 3の採用は遅れています。

  • Python 2.7 *は2010年に2.xリリースの最後として公開されました。 Python 2.7の背後にある意図は、Python 2.xのユーザーがPython 3に機能を移植しやすくすることで、両者の互換性をある程度測定することでした。

チュートリアル「https://www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2[Python 2 vs Python 3:実用的な考慮事項]。」

Python 2.7から始める

Python 3に移行するか、Python 2とPython 3を同時にサポートするには、Python 2コードが完全にPython 2.7互換であることを確認する必要があります。

多くの開発者は既にPython 2.7コードのみを使用していますが、以前のバージョンでのみサポートされているものはすべてPython 2.7で適切に動作し、Python 2.7スタイルと一貫性があることを確認することが重要です。

あなたのコードがPython 2.7であることを確認することは、Python 2の唯一のバージョンであり、まだメンテナンスされており、バグ修正を受けているため、特に重要です。 Python 2の以前のバージョンで作業している場合は、サポートされなくなり、バグ修正を受け取っていないコードで発生する問題を回避する必要があります。

さらに、プログラミングエラーを探すhttps://pypi.python.org/pypi/pylint[Pylint]パッケージなど、コードの移植を容易にするいくつかのツールは、以前のバージョンのPythonではサポートされていません2.7より。

Python 2.7は現在もサポートおよび保守されていますが、最終的には廃止されることを忘れないでください。 PEP 373は、Python 2.7のリリーススケジュールの詳細を示しており、執筆時点で、その日没日を2020としてマークしています。

テスト範囲

テストケースの作成は、Python 2をPython 3コードに移行するために行われる作業の重要な部分です。 Pythonの複数のバージョンを維持している場合は、テストスイートが全体的に適切にカバーされていることを確認して、各バージョンが引き続き期待どおりに動作することを確認する必要があります。

テストの一部として、すべての関数、メソッド、クラス、およびモジュールのドキュメント文字列にインタラクティブなPythonケースを追加し、組み込みのhttps://docs.python.org/3.6/library/doctestを使用できます。 html [`+ doctest +`モジュール]を使用して、表示どおりに機能することを確認します。

+ doctest +`と並んで、https://pypi.python.org/pypi/coverage [+ coverage.py ` package]を使用して単体テストのカバレッジを追跡できます。 このツールはプログラムを監視し、コードのどの部分が実行されたか、どの部分が実行できたが実行されなかったかを記録します。 ` coverage.py +`は、コマンドラインにレポートを印刷したり、HTML出力を提供したりできます。 通常、テストの有効性を測定するために使用され、テストによって実行されるコードの部分とそうでない部分を示します。

100%のテストカバレッジを目指しているわけではないことに注意してください-紛らわしいコードや異常なコードをカバーするようにします。 ベストプラクティスを実現するには、80%のカバレッジを目指してください。

Python 2とPython 3の違いについて学ぶ

Python 2とPython 3の違いについて学習することで、Python 3で利用可能な、または利用できる新しい機能を活用できるようになります。

「https://www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2[Python 2 vs Python 3]」に関するガイドは、https:// www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2#key-differences [キーの違い] 2つのバージョン間で、https://docs.pythonを確認できます。詳細については、.org / 3 / [公式Pythonドキュメント]。

移植と移行を開始するとき、今すぐ実装できる構文の変更がいくつかあります。

+ print +

The + print + Python 2のステートメントは、Python 3でa + print()+ functionに変更されました

Python 2 Python 3

print "Hello, World!"

print("Hello, World!")

+ exec +

The Python 2の + exec + _statementは、Python 3で明示的なローカルおよびグローバルを許可する関数に変更されました。

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は + / +`でフロア分割を行います_https://www.digitalocean.com/community/tutorials/how-to-do-math-in-python-3-with-operators [operator]、Python 3が導入されました_ `+ // + フロア部門用

Python 2 Python 3

5 / 2 = 2

5 / 2 = 2.5

5 // 2 = 2

Python 2でこれらの演算子を使用するには、https://www.digitalocean.com/community/tutorials/how-to-import-modules-in-python-3 [import] `+ division `から ` future + `モジュール:

from __future__ import division

https://www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2#division-with-integers [整数による除算]について詳しく読む

+ raise +

_Python 3では、引数を使用して例外を発生させるには括弧が必要です。https://www.digitalocean.com/community/tutorial_series/working-with-strings-in-python-3 [strings]は例外として使用できません。

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では複数の例外をリストすることは困難でしたが、Python 3では変更されました

注意: + as _は、Python 3_で` + except + `と明示的に使用されます

Python 2 Python 3

except Exception, variable:

except AnException as variable:

except (OneException, TwoException) as variable:

+ def +

_Python 2では、関数はhttps://www.digitalocean.com/community/tutorials/understanding-tuples-in-python-3[tuples]またはhttps://www.digitalocean.com/community/tutorialsのようなシーケンスを取ることができます/ understanding-lists-in-python-3 [lists]。 Python 3では、この展開は削除されました。

Python 2 Python 3

def function(arg1, (x, y)):

def function(arg1, x_y): x, y = x_y

+ expr +

Python 2のバックティック構文はもう存在しません。 Python 3._で + repr()+ _ `+ str.format()+`を使用します

Python 2 Python 3

+x = \`355/113\+`

x = repr(355/113):

文字列のフォーマット

文字列のフォーマット構文がPython 2からPython 3に変更されました

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)

https://www.digitalocean.com/community/tutorials/how-to-use-string-formatters-in-python-3 [Python 3で文字列フォーマッターを使用する方法] .

+ class +

Python 3._で + object _ _を記述する必要はありません

  • Python 2 *

class MyClass(object):
   pass
  • Python 3 *

class MyClass:
   pass

Python3では、メタクラスは + 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との互換性を維持しながら、コードを自動的にPython 3に更新するために使用できる主なツールは2つあります。* http://python-future.org/automatic_conversion.html [future] および https:// python- modernize.readthedocs.io/en/latest/[modernize]*。 これらの各ツールの動作はやや異なります。+ future + `はPython 3のイディオムとベストプラクティスをPython 2で実現するように機能し、 + modernize + はPython https:// pypiを使用するPythonのPython 2/3サブセットを対象としています.python.org / pypi / six [+ six +` module]は互換性を改善します。

これらのツールを使用してコードの書き換えの詳細を処理すると、潜在的な問題とあいまいさを特定して修正するのに役立ちます。

ユニットテストスイート上でツールを実行して、コードを視覚的に検査および検証し、自動修正が正確であることを確認できます。 テストに合格すると、コードを変換できます。

ここから、特にhttps://www.digitalocean.com/community/tutorials/how-to-port-python-2-to-python-3#learn-about-をターゲットに手動で修正する必要があります。 difference-between-python-2-and-python-3 [上記のセクションで説明したPython 2と3の間の変更]。

`+ future `を活用して、各Python 2.7モジュールにこの ` import +`ステートメントを追加することを検討する必要があります。

from __future__ import print_function, division, absolute_imports, unicode_literals

これにより書き換えも行われますが、Python 2のコードがPython 3の構文と一致するようになります。

最後に、https://pypi.python.org/pypi/pylint [+ pylint + package]を使用して、コード内の他の潜在的な問題を特定できます。 このパッケージには、https://www.python.org/dev/peps/pep-0008/ [PEP 8スタイルガイド]ルールや使用エラーなど、発生する可能性のある広範な問題に対応する数百の個別のルールが含まれています。 。

コード内に、「+ pylint +」と自動移行に使用されるツールを混乱させる可能性のあるいくつかの構成要素があることに気付くかもしれません。 これらの構造を単純化できない場合は、ユニットテストケースを使用する必要があります。

継続的インテグレーション

Pythonの複数のバージョンのコードを維持する場合は、開発中のコードで可能な限り頻繁に(手動ではなく)継続的な統合を通じてユニットテストスイートを実行および再実行することに注意する必要があります。 。

Python 2および3の互換性維持の一環としてhttps://pypi.python.org/pypi/six [`+ six +`パッケージ]を使用する場合、テストには複数の環境を使用する必要があります。

使用を検討する環境管理ツールの1つはhttps://pypi.python.org/pypi/tox [+ tox + package]です。これは、さまざまなPythonバージョンでパッケージのインストールを確認し、各環境でテストを実行するためです。 、継続的インテグレーションサーバーのフロントエンドとして機能します。

結論

開発者とコミュニティの注目がPython 3に集中するにつれて、言語はより洗練され、プログラマーの進化するニーズに沿ったものになり、Python 2.7へのサポートが少なくなることに留意することが重要です。 Python 2とPython 3の両方のコードベースのバージョンを維持することにした場合、前のバージョンよりもバグ修正が少なくなるため、前者の方が困難になる可能性があります。