【问题标题】:Subclassing python dictionaries子类化python字典
【发布时间】:2012-04-23 12:40:02
【问题描述】:

我在我的 Python 应用程序中使用 ElasticSearch,并希望能够创建一个表示查询的可重用字典对象。 JSON 结构在此处描述 http://pulkitsinghal.blogspot.co.uk/2012/02/how-to-use-elasticsearch-query-dsl.html,我正在使用 PyES 来查询搜索服务器。使用 PyES,我们可以传递一个 dict 对象,该对象在发送到服务器之前会被 json 化。我想创建一个常见查询库,其中只有实际查询项发生变化,所以我想我将 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

【问题讨论】:

  • 您的StandardQuery 课程看起来不错。如果您想在个别情况下修改search_fieldsreturn_fields,请确保重新绑定而不是更改列表:类属性在这里完全合适,但当它们可变时您必须小心。

标签: python json oop elasticsearch


【解决方案1】:

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

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

【讨论】:

  • 谢谢@Duncan,这就是我的想法。创建 to_dict 方法可能比继承 JSONEncoder 更简单
  • TBH 我发现扩展 JSONEncoder 的接口非常笨拙,实际上它不支持我真正想做的扩展类型。
猜你喜欢
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 2016-11-16
  • 2020-04-18
  • 2014-10-02
  • 2018-08-03
相关资源
最近更新 更多