5

私のプロジェクトでは、Python 2.5 (Google App Engine) に固執する必要があります。アプリケーション (実際にはフレームワーク) のどこかで、どの変数が定義され、どの順序で定義されているかを追跡する必要があります。つまり、代入演算子が処理されるたびにインターセプトしたいと考えています。

__prepare__Python 3 を使用して、いつアクセスされたかを追跡するインテリジェントな辞書を返すメソッドを持つメタクラス M を定義します。次に、メタクラス M を使用してクラス ステートメント内のすべてを実行する必要があります。

これを Python 2.5 でエミュレートする方法はありますか?

私が達成したいことの例

Python 3 のメタクラス アプローチを使用すると、参照のように機能する変数を実装できます。たとえば、M はそのようにすることができます。

# y is a callable
class C(metaclass=M):
    x = ref(y)
    x = 1

は (C の作成まで) と同等ですy(1)。つまり、ブラック ボックスref関数による C の辞書内の変数への最初の代入により、この変数が作成されます。追加の割り当ては、ref 関数のパラメーターを呼び出すだけです。

4

2 に答える 2

3

クラスに入力する変数を、内部的にカウンターを保持し、増加する値を割り当てるラッパーでラップできます。ラッパーは、タグ付けまたは変数に動作を追加するためにサブクラス化される場合があります。変数値を使用してそれらを並べ替え、通常の Python 2 メタクラスを使用してクラスの作成をインターセプトします。

Django は、この手法を使用してモデル クラスでメンバーが定義された順序を記憶するプロジェクトの 1 つです。フィールドが作成された場所を見ることができます。__cmp__次に、フィールドを作成順に保つためにメソッドの実装で使用されます。

于 2010-10-06T09:59:56.087 に答える
-1

開始する場所の 1 つは、 PEP-3115を調べて、"現在の" 動作 (たとえば、Python 3 が実装される前の動作) について読むことです。

于 2010-10-06T08:43:57.520 に答える