setdefault() во вложенном словаре?

Попытка сохранить значения во вложенном словаре в полочном файле с помощью setdefult(). Есть ли простой способ сделать это? Следующий код, кажется, делает значения неизменяемыми, например, последняя строка не может изменить значение цены на 25.

room_data = shelve.open("data")

room_data.setdefault("key", {"type": "Standard Single", "available": 5, "price": 50, "adults": 1, "children": 0})

room_data["key"]["price"] = 25

Я надеялся заставить его работать с полкой, а потом добавить SQL, но сейчас может быть проще узнать это. Дайте мне знать, что вы думаете. Благодарю.

1 ответ

Решение

Вы должны установить writeback=True:

room_data = shelve.open("data", writeback=True)

А потом позвони room_data.sync() после изменения значения:

room_data.setdefault("key", {"type": "Standard Single", "available": 5, "price": 50, "adults": 1, "children": 0})

room_data["key"]["price"] = 25

room_data.sync()

В противном случае значение установлено, но заданное значение не может быть изменено.

Из записки на shelve.open:

Из-за семантики Python полка не может знать, когда изменяется изменяемая запись постоянного словаря. По умолчанию измененные объекты записываются только при назначении на полку (см. Пример). Если опционально writeback параметр установлен в True все записи, к которым осуществляется доступ, также кэшируются в памяти и записываются обратно sync() а также close(); это может сделать его более удобным для изменения изменяемых записей в постоянном словаре, но, если к многим записям обращаются, это может потребовать огромные объемы памяти для кэша, и это может сделать операцию закрытия очень медленной, так как все доступные записи записываются обратно (нет способа определить, какие записи были изменены, а какие были изменены.

Другие вопросы по тегам