12

「Python2またはPython3」のウォーミングアップには興味がありません。質問(私が見つけた最新のものは1年以上前のものですが)、しかし私はこの主張に出くわしました:

ファイルが次の行で始まる場合は、Python2でPython3コードを記述できます。

from __future__ import absolute_import, division, generators, unicode_literals, print_function, nested_scopes, with_statement

その行を配置すると、コードはPython2またはPython3のいずれかで機能します。まれに機能しない場合がありますが、見つかりませんでした。

これは本当ですか?この1行で、作成したコードがPython 2.x(> = 2.5と想定)と3.x(インポートされたモジュールが両方で使用可能であると想定)の両方で実行されることを確認できますか?

4

6 に答える 6

8

いいえ、これはバロニーです。これらのインポートを使用しても、Python 2と3の間には依然として大きな違いがあります。たとえば、input()Python3ではPython2と同様raw_input()です。Python3の場合はPython2の場合とrange()同様です。範囲が狭い限り、Python 2での使用を回避できる可能性がありますが、範囲が大きい場合、Python2とPython2ではプログラムのメモリ使用量が大きく異なる可能性があります。 Python3。xrange()xrange()range()

次のようなものをコードに追加できます。

try:
    range = xrange
    input = raw_input
except NameError:
    pass

しかし、その後、それらすべてのエッジケースを見つけて修正する必要があります。たとえば、Python 3にはイテレータを返すメソッドkeys()values()メソッドがありdictますが、Python 2にはリストがあります。そのため、それを「修正」するサブクラスを作成する必要がありますdict(その後、コードで辞書リテラルをラップせずに使用することはありません。それ以外の場合は、組み込みdictタイプになります)。

さまざまな修正を使用し__future__、このように作成されたPythonのサブセットでコードを記述して、2.xと3.xの両方で実行できるようにすることで、両方で実行されるコードを記述できる可能性があると思います。バージョン。しかし、多くの作業のようです。ユーティリティがあるのには理由があり2to3ます...

于 2012-06-19T14:46:13.120 に答える
7

"場合によります"

いいえ:これらのインポートをPython 2コードに追加しても、Python3では実行されません。

はい:これらのインポートを実行すると、Python2とPython3の両方で実行されるコードを記述できます。

しかし:繰り返しになりますが、これらのインポートなしでもそれを行うことができ、それらのいくつかは、unicode_literals単に役に立たないことが判明しています。Python2からPython3generatorsとはまったく関係ありません。これらは、Python2のバージョンで追加された機能です。with_statement

したがって、結論として、これらの輸入品は少し赤いニシンであり、ステートメントは正しいよりも間違っています。

ただし、これは、Python2とPython3の両方で実行されるコードを作成することが不可能である、または必ずしも非常に難しいという意味ではありません。詳細については、 http://python3porting.com/を参照してください。

于 2012-06-21T02:54:49.473 に答える
5

コードベースの要求によっては、それは不可能ではありません。おそらく、 6つ(2 * 3、はは)のライブラリが不可欠であることがわかるでしょう。もう1つの便利なツールは、コードを相互互換性のある状態に変換しようとするpython-modernizeです。

于 2012-06-19T15:19:38.880 に答える
4

__future__可能性は高くなりますが、インポートから取得できないものや、3.xで削除されるものがあります。

頭のてっぺんから、3.xで削除されたパラメータータプルアンパックを引き続き使用できます。また、3.xで導入されたスター演算子で素晴らしいタプルアンパックを使用することはできません。

例えば:

def some_function((x, y), magnitude): #This has been removed in 3.x
    pass

x, *y = (1, 2, 3) #This does not exist in 2.x

そうは言っても、そのようなことを避けるように注意すれば、両方のバージョンで機能するコードを確実に書くことができます。

明らかに、これは機能がバックポートされている2.xバージョンにのみ適用されます。このため、その行の一部は実際には完全に無意味です。たとえば、generatorswithステートメントをインポートできるバージョンには既にジェネレーターが標準として機能しているため、インポートする理由はありません。同じことがnested_scopes

一般に、3.x用に作成することをお勧めします。両方のバージョンをインストールして使用できるようにするための障壁はありません。本当に2.xのサポートがどうしても必要な場合は、必要な数のバックポート機能を備えた2.x用に作成し、2to3を使用して他のものをクリーンアップします。

于 2012-06-19T14:30:49.800 に答える
3

いや。他の人はいくつかの違いを指摘しました、他のものがあります。最も基本的なことの1つは、Python 3のネイティブ文字列がマルチバイトであるということです。これにより、他のプロセスへのパイプなど、シングルバイトのメカニズムと通信するときに問題が発生します。その他には、モジュールの名前変更(Tkinterからtkinter)が含まれ、TrueとFalseがキーワードになりました。

比較でさえ同じではないかもしれません、次の間違ったコード:

num = 42
txt = "3"

if txt < num:
    print ('Wow!')
else:
    print ('Doh!')

TypeErrorPy3でを生成しますが、Py2では生成しません。

開梱について言及されています。ディクショナリメソッド、、、items()およびkeys()リターンvalues()ビューオブジェクト(2.7では異なるメソッド名が使用されます)。Py3では、イテレータがより多く使用されます。たとえば、map()filter()、などから返されます。

于 2012-06-19T15:22:52.387 に答える
1

futureパッケージを使用できます: pip install future

In [1]: range(10)
Out[1]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [2]: from future.builtins import range

In [3]: range(10)
Out[3]: range(0, 10)

その他の例を含むチートシートは次のとおりです。http://python-future.org/compatible_idioms.html

于 2014-08-14T07:59:28.903 に答える