9

この話題はしばらくの間私を悩ませてきました。

私の Python プロジェクトでは、 Python バージョン 2.4 から 3.1 をサポートできるようにしたいと考えていました。これを行う方法について少し考えた結果、最終的に、Python の 4 つの異なるバージョン (2.4、2.5、2.6、および 3.1) のソース コードの 4 つの個別のフォークを用意することにしました。

私はこれを悪い決断だと考えるようになりました。これは主に Python のディストリビューションの問題が原因で、1 回ではなく 4 回実行しなければならなくなりました。

問題は、どうするかです。

私のプロジェクトは科学計算の分野です。Python 2.4に依存している人がまだ多い印象を受けました。

プロジェクト全体を 2.4 用に書くだけだと誰かが提案しましたが、それは私には受け入れられません。これは、コンテキスト マネージャーを使用できなかったことを意味します。これは、私があきらめないことです。

通常の Python プロジェクトはどのように 2.4 をサポートしていますか? コンテキストマネージャーの使用を避けていますか?

また、Python 3.1 用に別のフォークを用意する以外に選択肢はありますか? 同じコードを 2.x と 3.x で実行するためのあらゆる種類のハックがあることは知っていますが、私が Python を好きな理由の 1 つは、コードが美しいからです。

ご意見をお聞かせください。

4

6 に答える 6

1

はい、同じコードベースで 2.4 から 2.7 のすべてをサポートするには、Python 2.4 構文を記述する必要があります。

Python 2.6 と 2.7 のいくつかの変更は、3.x と互換性のあるコードを書きやすくすることを目的としていますが、そのためには 2.5 以下のサポートをやめなければなりません。

于 2009-12-09T14:32:12.077 に答える
1

あなたの問題にはさまざまな答えがあるようです。

まず、すべてのpython バージョンにすべての機能を提供したい場合は、そうです。おそらく、可能な限り最小の機能サブセットを使用することに固執しているため、Python 2.4 用のコードを記述しています。または、純粋な python の場合は、新しいインタープリターから機能をバックポートすることもできます (コンテキスト マネージャーやコルーチンの場合はそうではありません)。

または、バージョン サポートを機能に分割することもできます。たとえば、コンテキスト マネージャーなどから大きなメリットが得られる (オプションの) 機能が 1 つあると思われる場合は、それを別のモジュールで利用できるようにして、2.4 ユーザーは持っていないとだけ言うことができます。その機能。

Python 3 をサポートするには、2to3 ヘルパーを参照してください。コードを適切に記述すれば、2 つの別個のコードベースを維持する必要がない可能性がかなりあります。

于 2009-12-09T14:58:50.690 に答える
0

関連する問題があり、jython と cpython の両方を 2.4 までサポートする大規模なシステムです。基本的に、別の方法で記述する必要があるコードを、できれば小さなモジュール セットに分離し、条件付きでインポートする必要があります。

# module svn.py
import sys
if sys.platform.startswith('java'):
    from jythonsvn import *
else:
    from nativesvn import *

あなたの例では、おそらく sys.version_info に対してテストを使用します。次のように使用するユーティリティ モジュールでいくつかの単純なものを定義できます。 from util import *

# module util.py
import sys
if sys.exc_info[0] == 2:
    if sys.exc_info[1] == 4:
        from util_py4 import *
    ...

次に、util_py4.py 内のものは次のようになります。

def any(seq):                # define workaround functions where possible
    for a in seq:
        if a: return True
    return False
...

これは移植とは別の問題ですが (サポートを継続したいので)、このリンクは役立つガイダンスを提供しますhttp://python3porting.com/preparing.html (Python 2.x の移植に関する他のさまざまな記事と同様) .

ただし、コンテキストマネージャーなしでは生きていけないというあなたのコメントは少し混乱します。コンテキスト マネージャーは強力で、コードを読みやすくし、エラーのリスクを最小限に抑えますが、2.4 バージョンのコードに含めることはできません。

### 2.5 (with appropriate future import) and later
with open('foo','rb')as myfile:
   # do something with myfile

### 2.4 and earlier   
myfile = None
try:
    myfile = open('foo','rb')
    # do something with myfile
finally:
    if myfile: myfile.close()

2.4 をサポートしたいので、2 番目の構文だけが必要なコード本体ができます。両方の方法で書く方が本当にエレガントでしょうか?

于 2012-03-23T15:48:09.473 に答える
0

virtualenvを試して、単一の Python バージョンを使用してアプリケーションを配布できます。ただし、これはあなたの場合には実用的である場合とそうでない場合があります。

于 2009-12-09T19:28:53.983 に答える
0

バージョン間の違いが極端でない場合は、アダプテーション レイヤーとして機能するバージョン固有のコードを記述した別のパッケージまたはモジュールにそれらを分離してみることができます。

自明な方法で、これは単純なケースでは別のモジュールなしで実行できます。たとえば、Python の新しいバージョンが、(たとえば) simplejson など、以前は外部にあったパッケージを標準にする場合などです。一部のコードには、これに似たものがあります。

try:
    import simplejson as json
except ImportError:
    import json

おそらく持っているものなどの重要なものについては、そのようなものがコードベース全体にランダムに散らばってほしくないので、可能であればすべてを 1 か所に集めて、それをコードの唯一のセクションにする必要があります。それはバージョン固有です。

これは、コンテキストマネージャーを使用したいというコメントなど、構文が異なる場合にはうまく機能しません。確かに、コンテキスト マネージャーのコードを別のモジュールに入れることはできますが、それを使用する場所が複雑になる可能性があります。そのような場合、特定の重要な機能 (コンテキスト マネージャーは多少簡単にシミュレートできると思います) をこのアダプター モジュールにバックポートすることができます。

別々のコードベースを持つことは、あなたができる最悪のことであることは間違いありません. 少なくとも、新しいバージョンの Python の機能を恣意的に使用しないでください。コードにそれらを含めると (おそらくロジックの特定のブロックを単純化するために) 見栄えがするかもしれませんが、そのロジックをフォークして複製する必要があるためです。コードベースは、単一のモジュールであっても、利点を無効にする以上のものになります.

レガシー コードの古いバージョンに固執し、それらをサポートするために新しいリリースがリリースされると微調整しますが、古いバージョンのサポートは維持し、時には小さなアダプター レイヤーを使用します。ある時点で、コードのメジャー リリースがスケジュールに表示され、古い Python のサポートを終了する時期かどうかを検討します。それが起こると、いくつかのバージョンを飛び越えようとします。たとえば、2.4 から 2.6 に直接移行してから、新しい構文と適応できない機能を実際に利用し始めます。

于 2009-12-09T14:54:35.130 に答える
0

まず、Python 2.x は下位互換性があり、新しい機能と追加機能を除いて、ほとんど同じ構文を共有していることを覚えておく必要があります。DeprecationWarning メッセージは有害ではありませんが、見苦しく、混乱を招く可能性があるため、必ずしもエラーではないことを考慮する必要があります。

Python 3.x は設計上下位互換性がなく、古い技術をすべて残していくつもりです。Python 2.6 では、移行を容易にするために Python 3.x にもある多くの変更が導入されました。それらすべてを確認するには、What's New in Python 2.6ドキュメントを読むことをお勧めします。このため、Python 3.1 でも実行される Python 2.6 用のコードを作成することは非常に可能ですが、注意事項がないわけではありません。

2.x バージョン間でも多くのマイナーな構文変更があり、多くのコードをtry/exceptブロックでラップする必要があります。ブランチは完全に可能です。やりたいことをするために、オブジェクトに対して多くの属性と型のテストを行うことがわかると思います。

さまざまな Python バージョンをサポートしている主要なプロジェクトのコードを確認することをお勧めします。 ツイステッド マトリックスが最初に思い浮かびます。彼らのコードは、Python コードの書き方を示す素晴らしい例です。

結局、あなたがやろうとしていることは簡単ではないので、たくさんの仕事に備えてください!

于 2009-12-09T14:58:10.067 に答える