2to3-自動化されたPython2から3へのコード変換
2to3は、Python 2.xソースコードを読み取り、一連のフィクサーを適用して有効なPython3.xコードに変換するPythonプログラムです。 標準ライブラリには、ほぼすべてのコードを処理する豊富なフィクサーのセットが含まれています。 ただし、2to3サポートライブラリ lib2to3 は柔軟で汎用的なライブラリであるため、2to3用に独自のフィクサーを作成することができます。
2to3を使用する
2to3は通常、Pythonインタープリターとともにスクリプトとしてインストールされます。 また、PythonルートのTools/scripts
ディレクトリにもあります。
2to3の基本的な引数は、変換するファイルまたはディレクトリのリストです。 ディレクトリは、Pythonソースに対して再帰的にトラバースされます。
Python2.xソースファイルのサンプルexample.py
は次のとおりです。
def greet(name):
print "Hello, {0}!".format(name)
print "What's your name?"
name = raw_input()
greet(name)
コマンドラインで2to3を介してPython3.xコードに変換できます。
$ 2to3 example.py
元のソースファイルとの差分が出力されます。 2to3は、必要な変更をソースファイルに直接書き戻すこともできます。 (-n
も指定されていない限り、元のファイルのバックアップが作成されます。)変更の書き戻しは-w
フラグで有効になります。
$ 2to3 -w example.py
変換後、example.py
は次のようになります。
def greet(name):
print("Hello, {0}!".format(name))
print("What's your name?")
name = input()
greet(name)
コメントと正確なインデントは、翻訳プロセス全体を通じて保持されます。
デフォルトでは、2to3は事前定義されたフィクサーのセットを実行します。 -l
フラグは、使用可能なすべての修正プログラムをリストします。 実行する修正プログラムの明示的なセットは、-f
で指定できます。 同様に、-x
は明示的にフィクサーを無効にします。 次の例では、imports
およびhas_key
フィクサーのみを実行します。
$ 2to3 -f imports -f has_key example.py
このコマンドは、apply
フィクサーを除くすべてのフィクサーを実行します。
$ 2to3 -x apply example.py
一部のフィクサーは explicit です。つまり、デフォルトでは実行されないため、実行するにはコマンドラインにリストする必要があります。 ここでは、デフォルトのフィクサーに加えて、idioms
フィクサーが実行されます。
$ 2to3 -f all -f idioms example.py
all
を渡すと、すべてのデフォルトの修正プログラムが有効になることに注意してください。
2to3は、ソースコード内で変更が必要な場所を見つけることがありますが、2to3は自動的に修正できません。 この場合、2to3はファイルの差分の下に警告を出力します。 3.xコードに準拠するには、警告に対処する必要があります。
2to3はdoctestをリファクタリングすることもできます。 このモードを有効にするには、-d
フラグを使用します。 のみのdoctestがリファクタリングされることに注意してください。 これはまた、モジュールが有効なPythonである必要はありません。 たとえば、reSTドキュメントの例のようなdoctestも、このオプションでリファクタリングできます。
-v
オプションを使用すると、翻訳プロセスに関する詳細情報を出力できます。
一部のprintステートメントは関数呼び出しまたはステートメントとして解析できるため、2to3はprint関数を含むファイルを常に読み取ることができるとは限りません。 2to3は、from __future__ import print_function
コンパイラ指令の存在を検出すると、 print()を関数として解釈するように内部文法を変更します。 この変更は、-p
フラグを使用して手動で有効にすることもできます。 -p
を使用して、printステートメントが既に変換されているコードでフィクサーを実行します。 また、-e
を使用して、 exec()を関数にすることもできます。
-o
または--output-dir
オプションを使用すると、処理済みの出力ファイルを書き込むための代替ディレクトリを指定できます。 -n
フラグは、これを使用する場合に必要です。入力ファイルを上書きしない場合、バックアップファイルは意味をなさないためです。
バージョン3.2.3の新機能: -o
オプションが追加されました。
-W
または--write-unchanged-files
フラグは、ファイルに変更が必要ない場合でも、常に出力ファイルを書き込むように2to3に指示します。 これは-o
で最も役立ち、Pythonソースツリー全体が1つのディレクトリから別のディレクトリへの変換でコピーされます。 このオプションは、-w
フラグを意味します。それ以外の場合は、意味がありません。
バージョン3.2.3の新機能: -W
フラグが追加されました。
--add-suffix
オプションは、すべての出力ファイル名に追加する文字列を指定します。 別のファイル名に書き込む場合はバックアップが不要であるため、これを指定する場合は-n
フラグが必要です。 例:
$ 2to3 -n -W --add-suffix=3 example.py
example.py3
という名前の変換されたファイルが書き込まれます。
バージョン3.2.3の新機能: --add-suffix
オプションが追加されました。
プロジェクト全体をあるディレクトリツリーから別のディレクトリツリーに変換するには、次のようにします。
$ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode
フィクサー
コードを変換する各ステップは、フィクサーにカプセル化されています。 コマンド2to3 -l
はそれらをリストします。 上記の [[#to3-using|]] に記載されているように、それぞれを個別にオンまたはオフにすることができます。 これらについては、ここで詳しく説明します。