LINUX.ORG.RU

[Пистонистам] А как бы эдак сохранить переменную в файл?


0

1

Есть такой замечательный модуль - pickle . Который конечно хорош, но не справляется со сложными переменными.

У меня есть большой и толстый словарь такого вида:

Dict = {«ololo»:[obj,obj, ... ], ...}

где obj - это экземляр объекта, который хранит данные, для удобного доступа:

Dict[«ololo»][5].X Dict[«ololo»][5].Y и т.д.

так вот pickle не справляется с тем, чтобы нормально сохранить эту беде в файл, сохранять-то сохраняет, но потом не хочет загружать ругается таким образом:

AttributeError: 'module' object has no attribute 'obj'

Что есть в питоне такого, чтобы залепить весь этот словарь в файл в бинарном виде и вылепить его потом оттуда?

★★★★★

В принципе RTFM, но я таки отвечу;-)

Дело в том, что для польщовательских классов сохраняются только данные (содержимое __dict__), название класса и название модуля из которого этот класс. При обратной сериализации модуль импортируется, из него создается экземпляр класса и на него накатываются сохраненные данные (конструктор класса при этом НЕ вызывается). Судя по симптоматике, Вы создали класс где то не там или не так.

Лучше для сериализации ограничваться встроенными типами данных, или классами имеющими статус библиотченых. В модуле содержащем класс не должно произволистя никаких десйтвий, иначе они будут выполнятся каждый раз при подъеме данных;-)

AIv ★★★★★
()
Ответ на: комментарий от AIv

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

AIv ★★★★★
()
Ответ на: комментарий от AIv

испортить = импортить, очепятка;-)

AIv ★★★★★
()
Ответ на: комментарий от AIv

>Судя по симптоматике, Вы создали класс где то не там или не так.

этот класс у меня находится внутри другого класса, который я подключаю как модуль =)

Лучше для сериализации ограничваться встроенными типами данных, или классами имеющими статус библиотченых


Да пожалуй лучше так и сделаю, поменяю класс на словарь =)

Siado ★★★★★
() автор топика
Ответ на: комментарий от Siado

Попробуйте тогда тот класс, который как модуль, перед чтением данных прописать ручками в sys.modules - должно зарабоать.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Это после C++ осталась привычка сложные данные хранить в классах =)

Siado ★★★★★
() автор топика
Ответ на: комментарий от AIv

>Оу, месье знает толк в извращениях... ;-)

Да ладно, что плохого в классах внутри классов?:)

anonymous
()
Ответ на: комментарий от AIv

Надо же, после того как вместо класса начал использоват словарь - размер фала с дампом упас с 6 мегобайт до 1.5 мегобайта

Siado ★★★★★
() автор топика
Ответ на: комментарий от Siado

Ну если было много экземпляров obj (для каждого писалось имя класса и имя модуля) а данных в каждом экземпляре было мало... то это нормально;-)

Если размер критичен, лучше юзать списки-кортежи (ИМНО).

AIv ★★★★★
()
Ответ на: комментарий от pylin

Скорость ИМНО будет таки повыше, а для доступа можно его распаковывать a,b,c,d,e,f,... = mytuple

У питоновского списка как ни странно доступ такой же быстрый как и у массива (насколько я в свое время тестил). Ну в общем от задачи зависит... никто не мешает перегрузить __getstate__/__setstate__ и там изголятся как угодно;-)

AIv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.