PythonアプリケーションでElasticSearchを使用していて、クエリを表す再利用可能な辞書オブジェクトを作成したいと考えています。 JSONの構造についてはhttp://pulkitsinghal.blogspot.co.uk/2012/02/how-to-use-elasticsearch-query-dsl.htmlで説明していますが、PyESを使用して検索サーバーを照会しています。 PyESを使うと、サーバに送る前にjsonifiedになっているdictオブジェクトを渡すことができます。私は実際のクエリの用語だけが変化する共通クエリのライブラリを作成したいので、サブクラスをサブクラス化してコンストラクタを介してクエリ用語を渡すことができると思っていました。次のようなもの:Python辞書のサブクラス化
どうすればよいですか?インスタンスのメンバーだけが__dict__
で返されるのは本当ですか?その場合、コンストラクタでこのデータ構造を設定する必要がありますか?これを行うにはこれが最善の方法ですか、または辞書を拡張しないクラスを作成して、正しい構造で辞書を返すto_dict()
メソッドを作成するだけですか?
回答:
これは、これはより「ニシキヘビ」作るための任意の提案が理解されるであろう、正常に動作するようです!あなたは、通常のdict
行動のすべてをしたくないなら、あなたは間違いなくちょうど別のクラスを作成する必要があります
class StandardQuery(object):
search_fields = ['meta_keywords', 'meta_description', \
'fields.title.value', 'slug']
return_fields = ['slug', 'fields.title.value']
def __init__(self, query):
self.query = query
def to_dict(self):
output = dict()
output['fields'] = self.search_fields
output['query'] = {'query_string': {'fields': self.return_fields, \
'query': self.query, 'use_dis_max': True}}
return output
あなたの 'StandardQuery'クラスは上手く見えます。個々のインスタンスで 'search_fields'や' return_fields'を変更したいのであれば、リストを変更するのではなく、再バインドしてください。ここではクラス属性は完全に適切ですが、変更可能なときは注意が必要です。 – Duncan