3

私はいくつかの PloneFormGen 作業を行っています。現在、PloneFormGen は入力されたフォーム エントリを関連する列情報なしのタプルとして内部的に保存します。新しい列 (フォーム フィールド) が追加されると、既存のデータは無効になります。

これは、入力された列の順序と列 ID の両方を保持する順序付けられた辞書にデータを格納することを簡単に回避できます。

ZODB には、順序付けられた辞書と同等のデータ型がありますか? 可能であれば、一致する API (Python dict のようなアイテムの操作とアクセス) でも可能ですか?

4

4 に答える 4

5

ZODBでは、すぐに使用できる順序付きdict実装を使用できますが、親オブジェクト(順序付きdictインスタンスを参照するオブジェクト)を変更するparent = odict_instanceたびに、またはを使用して変更済みとしてマークする必要があります。に設定_p_changedTrueます。もちろん、これにより、順序付けられたdictインスタンスとともに親の新しい永続レコードが作成されます。

順序付けられたdictインスタンス自体が変更を自動的に検出するようにしたい場合は、現在の実装を認識していないため、おそらく独自のクラスを作成する必要があります。とは言うものの、特にZODBPersistentMappingクラスを、同じものの順序付けされたバージョンを構築する方法のテンプレートとして使用する場合は、そうするのはおそらく非常に簡単です。super()残念ながら、そのクラスは呼び出しを使用する代わりにUserDictメソッドを直接参照するため、ミックスインとして使用することはできません(persistent.Persistent新しいスタイルのクラスではありません)。

Python 2.7には、標準ライブラリに順序付けられたdictクラスがあります。おそらくあなたはまだPloneでPython2.6を使用しているので、それをバックポートする必要があります。ただし、バックポートを取得したら、実装はソースコードPersistentOrderedDictからの直接コピーであり、すべてのインスタンスがOrderedDictポートに置き換えられます。PersistentMappingUserDict.IterableUserDict

于 2012-03-26T10:03:10.443 に答える
4

現在の実装を認識していないため、おそらく独自のクラスを作成する必要があります。

PersistentDict と OOBtree に基づいて順序付けられた dict を永続化する ZODB の実装は、次の場所にあります。

https://github.com/bluedynamics/node.ext.zodb/blob/master/src/node/ext/zodb/utils.py

この実装は odict パッケージに基づいています:

http://pypi.python.org/pypi/odict

オブジェクトを継承する dict 型を ZODB に保持することはできないため (persistent.Persistent と dict には互換性のない低レベルの実装があるため)、odict はさまざまな基本クラスを簡単にフックする方法を提供します (_dict_impl 関数を内部的に使用する)。これが、Python 2.7 の順序付けられた dict の実装または他のサードパーティの順序付けられた dict の実装でさえ、odict パッケージがまだ使用されている理由です。

于 2012-04-11T17:15:09.890 に答える
2

werkzeugとpasteの両方がordereddictsを提供します。あなたは間違いなくあなたの目的のためにそれらを漬けることができます。

于 2012-03-26T09:07:12.280 に答える
0

Pythonオブジェクトをピクルス化できる場合は、ZODB内で永続化できます。

PersistantMappingを見てください。私が理解していることから、次のようなミックスインクラスを作成するだけで十分なはずです。

class PersistantOrderedDict(PersistantMapping, OrderedDict):
于 2012-03-26T09:10:33.933 に答える