Можно ли распаковать экземпляры класса после преобразования старого стиля в новый?

Возможно ли в 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, будут приветствоваться; самое близкое, что я нашел, было хорошее объяснение того, почему травление небезопасно , описывающее травление как «простую виртуальную машину на основе стека-, что хорошо, но не дает мне достаточно, чтобы понять даже основы распаковки себя.

6
задан Community 23 May 2017 в 11:46
поделиться