pymongoでcollection.find()
、ベースから継承するカスタムカーソルクラスをメソッドに返すことは可能ですか?ただし、反復の発生方法を再定義しますか?
反復時にカーソル内のmongoデータからアプリ固有のモデルをインスタンス化したいと思います。ドキュメントには、type
作成するインスタンスの種類を決定する属性があります。next
メソッドがこのデータ内を調べて、作成して返すタイプを決定できると考えていました。カーソルからの継承は簡単ですが、これを操作にフックする場所がわかりませんfind()
か?
代わりに編集...
私が現在行っているのはyield
、フェッチが実行された後にオブジェクトを分類するジェネレーターを吐き出すために使用することです。
@classmethod
def gather(cls,place_id):
"""
Gather instances of all the shouts for one place
"""
shouts = cls.collection.find({'place_id':place_id})
for s in shouts:
yield Shout.classify(s)
@classmethod
def classify(cls,shout):
if shout.type == 1:
return Type1(dict(shout))
elif shout.type == 2:
return Type2(dict(shout))
elif shout.type == 3:
return Type3(dict(shout))
問題は、これがデフォルトのpymongoにカプセル化されているブラケットキーアクセスへの元のアプローチを保持しないことですCursor
。
カーソルインスタンスを受け入れてそのメソッドをラップするラッパークラスを作成する場合、元のカーソルの反復動作を維持するためにオーバーライドする必要があるマジックメソッドはどれですか?私はこのようなことを考えています:
class StuffCursor():
cursor = False
def __init__(self,cursor):
self.cursor = cursor
def __getattr__(self,attr):
#This passes off most key-based calls, like bracket-access, to the cursor
return getattr(self.cursor,attr)
これは私が考えることができることですが、イテレータの上に追加の処理をスタックし、変更されたイテレータを返すものなら何でも機能します。