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()
; это может сделать его более удобным для изменения изменяемых записей в постоянном словаре, но, если к многим записям обращаются, это может потребовать огромные объемы памяти для кэша, и это может сделать операцию закрытия очень медленной, так как все доступные записи записываются обратно (нет способа определить, какие записи были изменены, а какие были изменены.