私は ZODB のインストールを行っており、数百万個のさまざまな種類のオブジェクトを整理する必要があります。Table
属性またはこれらの属性の組み合わせによってオブジェクトにインデックスを付ける BTree を含む汎用コンテナー クラスがあります。データの一貫性は非常に重要であるため、インデックス作成の対象となる属性に書き込むと、インデックスが自動的に更新されるようにしたいと考えています。したがって、obj.a = x
すべての新しい従属インデックス エントリを計算し、衝突があるかどうかを確認し、最後にインデックスと値を書き込むには、シンプルで十分なはずです。
一般的に、私はそのためにライブラリを喜んで使用するので、repoze.catalogとIndexedCatalogを見ていましたが、それにはあまり満足していませんでした。IndexedCatalog はかなり長い間死んでいるように見え、オブジェクトへの変更に対してある種の一貫性を提供していません。repoze.catalog は、より使用され、アクティブになっているようですが、私が理解している限り、この種の一貫性も提供していません。ここで何かを見逃した場合は、それについて聞きたいですし、再発明するよりも再利用することを好みます.
したがって、問題のライブラリを見つけようとする以外に、記述子を使用してデータオブジェクト属性への書き込みアクセスをインターセプトし、Table
クラスにインデックスを変更する魔法を行わせる必要があります。そのために、記述子インスタンスは、どのTable
インスタンスと対話する必要があるかを知る必要があります。現在の実装は次のようになります。
class DatabaseElement(Persistent):
name = Property(constant_parameters)
...
class Property(object):
...
def __set__(self, obj, name, val):
val = self.check_value(val)
setattr(obj, '_' + name, val)
これらのDatabaseElement
クラスが生成されるとき、データベースとその中のオブジェクトはまだ作成されていません。したがって、この素敵な回答で述べたように、オブジェクトをインスタンス化引数としてTable
渡すことなく、オブジェクトを見つけるために、おそらくシングルトンルックアップメカニズムを作成する必要があります。Property
もっとエレガントな方法はありますか?記述子自体を永続化しますか? 提案やベストプラクティスの例を歓迎します!