11

2to3 は、Python 2.x ソース コードを読み取り、一連の修正プログラムを適用して有効な Python 3.x コードに変換する Python プログラムです。

https://docs.python.org/3/library/2to3.html#fixersにリストされている 40 の修正プログラムを検討してください。設計上、それらはすべて有効な Python 3 コードを出力します。有効なPython 2コードを出力するのはどれですか?

たとえば、Python 3 だけでなく Python 2 も有効であるため、「古い不等式構文<>!=" に変換する」修正プログラム NE にはこのプロパティがあります。!=

一方、「Renames __nonzero__to __bool__」というフィクサー NONZERO にはプロパティがありません。Python __bool__2.7 には機能がないためです。

4

1 に答える 1

0

What's New In Python 3.0から:

Python 2.6 と 3.0 の両方で変更されずに実行されるソース コードを作成しようとすることはお勧めできません。たとえば、print ステートメントやメタクラスなどを避けるなど、非常にゆがんだコーディング スタイルを使用する必要があります。Python 2.6 と Python 3.0 の両方をサポートする必要があるライブラリを維持している場合、最適な方法は、ソース コードの 3.0 バージョンを編集するのではなく、ソース コードの 2.6 バージョンを編集して 2to3 トランスレータを再度実行することにより、上記の手順 3 を変更することです。ソースコード。

3.0 の主要な新機能と変更点のほとんどもリストされているため、そこにあるリンクはかなり良いものです。

あなたの質問に関しては、あなたが求めているものに最も近いものはSixです。これはコンバーターやフィクサーではなく、多くのゆがんだコーディングを処理する互換性ライブラリです。とは言っても、それがどれだけうまく機能するかはわかりません。とにかくそれを利用するには、既存のコードに多くの変更を加える必要があります。

主な問題は、Python 3.x が構文の多くの基本的な側面を変更したため、何らかの互換性レイヤーがなければ、同じコードが 3.x と 2.x の両方で同じように機能することはほとんど不可能であるということです。Python 2 の文字列は、Python 3 の文字列と同じではありません。同じことが整数にも当てはまり、Python 3 にはもはや long 型さえありません (Python 3 の int は以前の long であり、古い Python 2 の int はなくなりました)。多くの組み込み関数と属性が名前変更または変更され、構文のほとんどが変更またはクリーンアップされて、後方互換性が完全に失われました。

2to3 を使用してコードを Python 3 に移植するでは、2to3 とその機能について少し説明します。記載されている膨大な量の構文変更は、結果として得られるコードが Python 2.x で機能しなくなる理由を説明するのに十分であることを願っています。

于 2014-11-07T09:39:02.487 に答える