Возможно ли в python распаковать объекты, которые были обработаны как классы старого-стиля python после преобразования в новые-стиля? (Т.е. объекты с разными "сигнатурами классов").*
Например, представьте, что некоторые экземпляры были сохранены как :
class foo: # old style
, а затем еще несколько объектов были обработаны после того, как класс был изменен для наследования от объекта.:
class foo(object): # new style
Объекты, которые pickle.dump
объединены с одним, могут быть pickle.load
одним и тем же классом стиля, но ни один из них не загрузит оба. Я думаю, что стратегия, используемая pickle, изменяется на основе наследования, (класс, который наследуется от объекта, имеет автоматически определенный метод __reduce__, а класс без наследования – нет). При попытке загрузить рассол с -старым-стилем наследования из кода без наследования (старого-определения стиля), я получаю ту же ошибку аргумента, что и в этом вопросе SO ; несмотря на то, что второй аргумент является избыточным, он по-прежнему изменяет «подпись класса» и ожидаемые аргументы и предотвращает загрузку. Чтобы решить эту проблему, я был бы счастлив написать unpickler, хотя я боюсь, что это может включать два отдельных под-класса unpicklers а-ля документы ... Если бы я знал, как правильно unpickle каждый я был бы в порядке делать это.
Немного предыстории моей ситуации... Я использую класс TrialHandler для сохранения и перезагрузки нажатий кнопок и времени реакции для экспериментов по поведенческой психологии. Мы реорганизовали класс TrialHandler, чтобы он наследовался от более абстрактного baseTrialHandler, но при этом временно изменил сигнатуру класса, чтобы он наследовался от объекта . Однако мы не смогли распаковать старые пробные_файлы обработчиков,поэтому его поменяли обратно. Я хотел бы просмотреть данные одного и того же эксперимента, который был запущен с обеими версиями пробного обработчика, и поэтому хочу распаковать оба типа сохраненных файлов журнала в одном сценарии.
В качестве альтернативы, если я не могу написать собственный распаковщик, который распаковывает оба объекта, есть ли другой способ их сериализации? Я попытался сделать дамп прямо в yaml, но, похоже, мне все равно придется зарегистрировать класс как нечто, что можно yaml'овать.
Полное описание проблемы с конкретными ошибками находится в списке рассылки PsychoPy. Любые сообщения в блогах, объясняющие детали промежуточного травления или даже наследования Python, будут приветствоваться; самое близкое, что я нашел, было хорошее объяснение того, почему травление небезопасно , описывающее травление как «простую виртуальную машину на основе стека-, что хорошо, но не дает мне достаточно, чтобы понять даже основы распаковки себя.