2012-04-11 25 views
3

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 
+0

あなたの 'StandardQuery'クラスは上手く見えます。個々のインスタンスで 'search_fields'や' return_fields'を変更したいのであれば、リストを変更するのではなく、再バインドしてください。ここではクラス属性は完全に適切ですが、変更可能なときは注意が必要です。 – Duncan

答えて

4

(はい私はドキュメントの文字列が存在しない知っています)。 引数をjson.dumps()として使用する場合は、jsonに変換してカスタムjsonエンコーダ(必要な場合はデコーダ)を作成する必要があるため、to_dict()メソッドを使用するか、それ以上の方法を使用できます。

json.dump()

json.dumps()オプションの引数defaultは、オブジェクトの直列化されたバージョンを返すか(デフォルトの動作を取得する)TypeErrorを上げる必要があるのいずれか呼び出し可能です。

+0

ありがとう@ダンカン、これは私が考えていたものです。 JSONncoderをサブクラス化するのではなく、to_dictメソッドを作成するほうが簡単かもしれません。 –

+0

TBH JSONEncoderを拡張するためのインターフェイスがかなり不器用であることがわかりました。実際には実際にやりたい拡張機能の種類をサポートしていません。 –

+0

@Duncan、編集を参照してください –