2011-01-01 5 views
0

Я заинтересован в экономии и нагрузки объектов с помощью модуля рассол, как вы можете прочитать в вопрос, я спросил раньше: Python: Errors saving and loading objects with pickle modulePython: сохранение и загрузка определения класса

Кто commment:

1, In an other way: the error is raise because pickle wanted to load an instance of the class Fruits and search for the class definition where it was defined, but it didn't find it so it raise the error

Теперь я хочу сохранить и загрузить определение класса, чтобы решить проблему, описанную в упомянутом выше вопросе. Большое вам спасибо!

+0

Если вы действительно имеете в виду «сохранить и загрузить определение класса», вот для чего нужны исходные файлы python ... –

+0

Не могли бы вы объяснить, __why__ вы хотите это сделать? – Keith

+2

Почему бы не просто «импортировать» класс, отдельно от загрузки маринованных объектов? Что случилось с простым «импортом»? –

ответ

7

Модуль рассола сохраняет и загружает внутреннее состояние объекта. Код не является частью внутреннего состояния, даже для классов, поэтому он становится сложным.

Очевидным способом является определение всего класса в строке, рассортирование этой строки, а затем ее загрузка и exec() этой строки. Другим вариантом, который может работать или не работать, является наличие метакласса, который также может рассортировать и распечатывать код, но это способ сложнее, а не лучше.

Это, однако, очень плохая идея по множеству причин, и я бы поставил на то, что значительная часть моей репутации указывает на то, что у вас нет веских оснований для этого. У вас с вероятностью 99,9%, подкрадываясь к неправильному дереву. Вы пытаетесь решить возникшую у вас проблему, потому что вы выбрали неправильное решение, чтобы что-то сделать, и теперь вы пытаетесь решить проблемы, которые дает вам решение, вместо того, чтобы выбирать лучшее решение, которое, вероятно, будет очень просто реализовать.

Таким образом, вам нужно не только объяснить текущую проблему, но и масштабную проблему, которую вы пытаетесь решить. Затем мы можем сказать вам, как лучше решить эту проблему.

+0

+1 для «попытки решить проблемы, которые дает вам решение» - идеальное описание этого синдрома. – bgporter

+0

+1 для ** «Это, однако, очень плохая идея ...» **. – martineau

+0

@ Lennart Regebro: Некоторая информация о usecase - «... что я преследую, чтобы закрыть сеанс, открыть новый и загрузить то, что я сохраняю в прошлой сессии.Я закрываю сеанс после помещения строки« filehandler.close () ", и я открываю новый, и я помещаю остальную часть вашего кода, а затем помещаю« object_file = pickle.load (файл) ». Я получаю эту ошибку: Traceback (последний последний вызов): Файл« », строка 1 , в object_file = pickle.load (файл) Файл «C: \ Python31 \ lib \ pickle.py», строка 1365, в кодировке нагрузки = кодирование, ошибки = ошибки) .load() AttributeError: объект «module» не имеет атрибут «Фрукты» - Петерстоун « – martineau

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