Реализовать распаковку и запаковку pickle-файлов
10 000 руб. за проект
Здравствуй, добрый человек!
В обработку поступает пикл-файл (преимущественно 2 прото-версии, но также 3, 4), в котором запиклены как и простые типы/структуры данных (словари, множества и так далее) так и классы/модули из пользовательского пространства (Они не существуют в текущем окружении).
Необходимо расдампить содержимое файла (при этом не доставлять/не импортировать или самостоятельно не описывать пользовательские классы или модули) а создавать «виртуальные» классы и модули, которые мимикрируют под оригинал.
Например - импортируется некий `from foo.bar import Baz`, мы дампим его арги/кварги и стейт в собственный класс, запоминания имя и путь. То что нужно делается тут https://github.com/CensoredUsername/picklemagic, но есть еще объекты с `append` или `setitems` (foo[«bar»] = «bar»), но думаю тут можно вполне сделать класс умеющие сохранять значения этих операций.
В дальнейшем предполагается пропустить полученный слепок через обработчик (например https://jsonpickle.github.io/) чтобы отобразить содержимое в json.
Если попробовать схематически расписать флоу, то оно выглядит примерно так:
- загружаем модуль (попутно фейками неимпортируемые объекты)
- перегоняем весь модуль в жсон
- полученный жсон загружаем обратно в модуль
Пару важных ключевых моментов
Проверка будет происходить путем загрузки пикл-дампа, его инспекции через `pickletools` и сравнение репорта с выводом в жсон.
При успехе жсон пакуется обратно и побайтово сравниваем с оригиналом (это не должно быть проблемой, так как это делает питон и при наличии правильных фейковых классов все аккуратно запакуется обратно)
UPD: с такой историей могли столкнуться, к примеру, те кто работает с `renpy` и декодирует файлы игры и файлы сохранений.
В обработку поступает пикл-файл (преимущественно 2 прото-версии, но также 3, 4), в котором запиклены как и простые типы/структуры данных (словари, множества и так далее) так и классы/модули из пользовательского пространства (Они не существуют в текущем окружении).
Необходимо расдампить содержимое файла (при этом не доставлять/не импортировать или самостоятельно не описывать пользовательские классы или модули) а создавать «виртуальные» классы и модули, которые мимикрируют под оригинал.
Например - импортируется некий `from foo.bar import Baz`, мы дампим его арги/кварги и стейт в собственный класс, запоминания имя и путь. То что нужно делается тут https://github.com/CensoredUsername/picklemagic, но есть еще объекты с `append` или `setitems` (foo[«bar»] = «bar»), но думаю тут можно вполне сделать класс умеющие сохранять значения этих операций.
В дальнейшем предполагается пропустить полученный слепок через обработчик (например https://jsonpickle.github.io/) чтобы отобразить содержимое в json.
Если попробовать схематически расписать флоу, то оно выглядит примерно так:
- загружаем модуль (попутно фейками неимпортируемые объекты)
- перегоняем весь модуль в жсон
- полученный жсон загружаем обратно в модуль
- модуль дампим обратно (в ту же версию прото, какая была при загрузке)
Пару важных ключевых моментов
- в дампах нет «хитрых» типов ака функции, лямбды
- воссоздание модуля из жсона или запись модуль в пикл происходит в другом процессе и доступа к памяти при распикливании нет.
- пикл после всей машинерии обязан быть эквивалентен (при условии что жсон не модифицировали конечно же)
Проверка будет происходить путем загрузки пикл-дампа, его инспекции через `pickletools` и сравнение репорта с выводом в жсон.
При успехе жсон пакуется обратно и побайтово сравниваем с оригиналом (это не должно быть проблемой, так как это делает питон и при наличии правильных фейковых классов все аккуратно запакуется обратно)
UPD: с такой историей могли столкнуться, к примеру, те кто работает с `renpy` и декодирует файлы игры и файлы сохранений.
В заказе есть исполнитель
При переводе заказа из архивного в актуальный, текущий исполнитель будет снят с задачи.
Выберите тип сделки
С безопасной сделкой вы всегда сможете вернуть средства, если что-то пойдет не так. С простой сделкой вы самостоятельно договариваетесь с исполнителем об оплате и берете на себя решение конфликтов.