子类化python词典

时间:2012-04-11 07:59:20

标签: python json oop elasticsearch

我在我的Python应用程序中使用ElasticSearch,并希望能够创建一个代表查询的可重用字典对象。这里描述了JSON结构http://pulkitsinghal.blogspot.co.uk/2012/02/how-to-use-elasticsearch-query-dsl.html,我正在使用PyES来查询搜索服务器。使用PyES,我们可以传递一个dict对象,该对象在发送到服务器之前会被jsonified。我想创建一个常见查询库,其中只有实际查询项发生变化,所以我认为我会子类化dict,所以我可以通过构造函数传递查询项,例如,当dict被jsonified时,我最终会像这样的东西:

{
  "fields": [
    "name",
    "shortDescription",
    "longDescription"
  ],
  "query": {
    "query_string": {
      "fields": [
        "name"
      ],
      "query": query_term,
      "use_dis_max": true
    }
  }
}

我该怎么做?是真的只有实例成员通过__dict__返回,如果是这样,我必须在构造函数中设置这个数据结构吗?这是执行此操作的最佳方法,还是应该创建一个不扩展dict的类,只创建一个以正确结构返回字典的to_dict()方法?

答案:

这似乎工作正常,任何建议使这更'pythonic'将不胜感激! (是的,我知道没有文档字符串)

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

1 个答案:

答案 0 :(得分:4)

如果您不想要所有正常的dict行为,那么您一定要创建一个单独的类。然后你可以给它一个to_dict()方法,或者更好,因为你真的想要转换为json创建一个自定义的json编码器(如果需要解码器),可以使用default json.dumps()参数}。

json.dump()json.dumps()中,可选参数default是一个可调用的,应返回对象的序列化版本或引发TypeError(以获取默认行为)