【问题标题】:Python desktopcouch storing dictPython desktopcouch 存储字典
【发布时间】:2011-12-18 00:33:18
【问题描述】:

首先,desktopcouch.records.server.CouchDatabase 的一个奇怪行为:

db.get_record(id) 返回:

<desktopcouch.records.RecordDict object at 0x9198f2c>

db.get_records('mytype', True) 返回数组:

<Row id='5rMlni6ZYudp5gvSADve1Y', key='mytype', ...>

db 是CouchDatabase('mydb', create=True)

为什么会有这种差异?

这会导致返回我的字典,该字典保存为空字典 {},在第一种情况下为 &lt;desktopcouch.records.RecordDict object at 0x9198f2c&gt;,在第二种情况下为 {}。

这在使用 db.get_record(id) 获取它并使用 db.update_fields(id, record) 更新时会产生一些问题。它抛出''Document'对象没有属性'read''

我哪里做错了?

编辑:

我向 Desktop CouchDB 发布了一个错误,并附有解释和 sn-p 以重现此行为 https://bugs.launchpad.net/desktopcouch/+bug/905913

【问题讨论】:

  • RecordDict 好像也是个字典,你能试试吗?
  • @FelixYan 感谢您的回答。尝试什么?当它具有 RecordDict 属性时,它无法保存我的记录。一切都适用于常规 {}。顺便说一句,有一些用于 desktopcpuch 的 API 文档吗?我发现只有freedesktop.org/wiki/Specifications/desktopcouch/Documentation 看起来很差。
  • 不太了解,不过你还是可以试试dict()它,如果真的是一个dict(如它的名字所示),那么你会得到一个python dict。
  • 我试过了,但同样的错误,现在我发现是什么原因,我更加困惑。看看这段代码和它打印的内容gist.github.com/1492994(tmp 是 desktopcouch.records.Record),这是原因之一。我预计最后一次打印是 {},而不是

标签: python dictionary nosql couchdb record


【解决方案1】:

通过查看它的代码,我发现它不是一个普通的dict,但无论如何你都可以让它成为dict。

试试这个:

print dict(tmp['logs'].items())

编辑:

至于混淆,当您将转换后的 dict 设置回 Record 对象时,它会运行

super(Record, self).__setitem__(key, item)

所以根据它的继承,它运行RecordDict对象的__setitem__方法,该方法运行:

super(RecordDict, self).__setitem__(key, item)

所以再看RecordData对象的__setitem__方法,它是:

def __setitem__(self, key, item):
    if isinstance(item, (list, tuple, dict)):
        item = record_factory(item)
    if hasattr(item, '_data'):
        item = item._data
    self._data[key] = item

所以它使用record_factory 将您解析的字典再次转换为RecordDict。所以你会看到这些结果:)

【讨论】:

  • 谢谢,但这给出了相同的结果gist.github.com/1492994。我可以转换它,无论是否调用 items() 方法。但不能将其分配回我的记录。恐怕我错过了某事并走错了路。我应该找出为什么 db.get_record() 和 db.get_records() 返回不同的结果(数据类型)。
  • A print dict(tmp['logs'].items()) 返回空字典应该意味着 RecordDict 真的是空的,记录到它的代码中。您也可以尝试对 RecordDict 对象使用其他方法,例如 .keys(),它们也应该返回空列表。
  • 关于赋值,你可以使用record_factory模块级方法,将dict、list或tuple转换为RecordDictMergeableList
  • 但是为什么没有将值分配给变量(第 3 行)?!? :)
  • 不,是 desktopcouch.records.Record
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 2015-05-28
  • 2021-08-07
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 2011-07-13
相关资源
最近更新 更多