Я хотел бы законсервировать-дамп объекта, как это:Рассол дамп объект ссылается модуль
import module_A
import module_B
class SomeClass(object):
def __init__(self, the_module):
self.module = the_module
self.some_other_members = whatever
x = SomeClass(module_A)
не допускается, и ошибка в том, что я не могу сбросить модуль. В этом случае меня не интересует фактический сброс модуля. Однако, какой модуль использует объект. Поэтому я хотел бы сбросить некоторый идентификатор модуля таким образом, чтобы на __setstate__
я мог указать self.module
на правый модуль. Какие идентификаторы я должен использовать так, чтобы на __setstate__
я могу найти правильный модуль по этому идентификатору? Могут быть много возможных модулей, и класс SomeClass
теперь знает, какие из них есть.
UPDATE:
Извините сообщение об ошибке, мы обнаружили, когда мы использовали cPickle
. Обычная pickle
не имеет этой проблемы, и, как отметил Майк, dill
поддерживает также травильные модули. Окончательное решение, которое я использую, приведено здесь: https://mail.python.org/pipermail/python-ideas/2013-July/021959.html.
BTW: Я автор 'dill', поэтому, если вы обнаружите, что это не работает для вашего дела, дайте мне знать. –
Спасибо, Майк. Я использую это решение в https://mail.python.org/pipermail/python-ideas/2013-July/021959.html, но приятно знать, что укроп может это сделать. Используется ли такая же техника? Кстати, я обнаружил, что сериализованные строки из протокола укропа 2 в несколько раз больше, чем протокол cPickle 2. Есть ли способ уменьшить размер в дампах укропа, но поддерживать скорость загрузки? – shaoyl85
Ссылка, которую вы предоставляете, является одним из способов, которым «укроп» сериализует модуль. Для некоторых объектов (например, классов, функций и методов) вы можете изменить то, что «окунь», изменив «dill.settings». 'dill.settings ['byref'] = True' будет более точно имитировать то, что делает' cPickle'. 'dill.settings ['recurse'] = True' будет включать только соответствующие зависимости от' globals', а по умолчанию - все. Соленые огурцы более длинные, потому что для обработки большего количества случаев нужно раскрыть больше инструкций. –