2012-06-12 4 views
0

С plistlib Я могу сериализовать структуру словаря/списка в plist. Это работает нормально, и я также могу прочитать его с той же библиотекой.Изменение plist в Python

Проблема в том, что словари имеют тип «_internalDict», и я, похоже, не могу их изменить. Например, например:

d = plistlib.readPlist('someplist.plist') 
v = d['value'] # v is an _internalDict 
v['val'] = 'new val' # works 
del v # doesn't work 
v = {'someotherkey': 'someothervalue'} # doesn't work either 

Пальчик, похоже, не меняется. Помогите?

+0

'del v' удаляет весь словарь, а' v = {...} 'создает новый словарь. Это то, что вы хотите, или пытаетесь удалить ключи из dict? '_InternalDict' - это просто подкласс' dict', который оставляет обычные операции 'dict' на месте. –

+0

да, это то, что я хочу – pistacchio

+0

Тогда у вас нет проблем, на мой взгляд; вы получаете ошибки при удалении всего словаря или при его замене новым? 'plistlib' может иметь дело с регулярными dicts просто отлично, кстати. –

ответ

3

Вам нужно удалить ключ из d Dict:

del d['value'] 

Устанавливая v = d['value'] вы только создать новую переменную, которая указывает на то же значение, что и d['value'], но удаление v не удалит dict из родительской структуры.

Чтобы заменить Dict в целом, вам снова нужно манипулировать родительскую Dict:

d['value'] = { 'foo': 'bar' } 

Если вы выполняете v = { ... } то, что вы делаете, назначая ссылку на новое значение dict к переменной v, заменив ссылка на d['value']dict; вы не манипулируете исходным значением в файле d dict.

plistlib._InternalDict - это всего лишь подкласс dict, который дает предупреждения об использовании атрибута, который теперь устарел; в противном случае он действует точно так же, как обычный тип dict.

Смежные вопросы