Настольный диван Python для хранения диктов - PullRequest
0 голосов
/ 18 декабря 2011

Прежде всего, одно странное поведение 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)

Почему эта разница?

Это приводит к возвращению моего dict, который сохраняется в записи как пустого dict {}, как <desktopcouch.records.RecordDict object at 0x9198f2c> в первоми как {} во втором случае.

Это создает некоторые проблемы при извлечении его с помощью db.get_record (id) и обновлении с помощью db.update_fields (id, record).Он выдает объект '' Document ', не имеющий атрибута' read ''

Где я делаю это неправильно?

EDIT:

Я опубликовалошибка Desktop CouchDB с пояснениями и фрагментом для воспроизведения этого поведения https://bugs.launchpad.net/desktopcouch/+bug/905913

1 Ответ

1 голос
/ 18 декабря 2011

Изучив его код, я обнаружил, что это не обычный диктат, но вы все равно можете его заставить диктовать.

Попробуйте:

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

РЕДАКТИРОВАТЬ:

Что касается путаницы, когда вы устанавливаете преобразованный dict обратно в Record объект, он запускает

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

Так что в соответствии со своим наследованием он запускает1014 * метод __setitem__ объекта, который выполняется:

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

Итак, еще раз, посмотрите метод __setitem__ объекта RecordData, это:

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.Итак, вы видите эти результаты:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...