Шаблоны для преобразования объектов Python (кодирование, декодирование, десериализация, сериализация)

Я работал с конструкцией модуля синтаксического анализа и обнаружил, что действительно очарован декларативным характером его структур данных. Для тех из вас, кто не знаком с ним, вы можете написать код на Python, который по сути выглядит как то, что вы пытаетесь проанализировать, вложив объекты при создании экземпляра.

Пример:

ethernet = Struct("ethernet_header",
   Bytes("destination", 6),
   Bytes("source", 6),
   Enum(UBInt16("type"),
       IPv4 = 0x0800,
       ARP = 0x0806,
       RARP = 0x8035,
       X25 = 0x0805,
       IPX = 0x8137,
       IPv6 = 0x86DD,
   ),
)

Хотя конструкция на самом деле не поддерживает хранение значений внутри этой структуры (вы можете анализировать абстрактный контейнер в поток байтов или поток байтов в абстрактный контейнер), я хочу расширить каркас, чтобы анализаторы могли также хранить значения при их анализе. что к ним можно получить доступ в точечном обозначении ethernet.type.

Но при этом, думаю, что наилучшим возможным решением здесь будет общий метод написания механизмов кодирования / декодирования, чтобы вы могли зарегистрировать механизм кодирования / декодирования и иметь возможность создавать различные выходные данные из абстрактной структуры данных (сам синтаксический анализатор).), а также вывод парсера.

Чтобы дать вам пример, по умолчанию, когда вы запускаете ethernet, упакованный через анализатор, вы получаете что-то вроде dict:

Container(name='ethernet_header', 
    destination='\x01\x02\x03\x04\x05\x06', 
    source='\x01\x02\x03\x04\x05\x06', 
    type=IPX
)

Я не хочу разбирать вещи дважды - в идеале мне бы хотелось, чтобы парсер генерировал "целевой" объект / строки / байты в настраиваемой форме.

Корень идеи заключается в том, что вы могли бы зарегистрировать различные "плагины" для использования или обработки структур, чтобы вы могли программно генерировать диаграммы XML или Graphviz, а также иметь возможность конвертировать байты в Python. Суть задачи состоит в том, чтобы пройтись по дереву узлов и на основе кодера / декодера преобразовать и вернуть преобразованные объекты.

Таким образом, вопрос по существу - какие шаблоны лучше всего подходят для этой цели?


стиль кодека:

Я посмотрел на модуль кодеков, который довольно элегантен тем, что вы создаете механизмы кодирования, регистрируете, что ваш класс может кодировать вещи, и вы можете указать конкретную кодировку, которую вы хотите на лету.

'blah blah'.encode('utf8')


serdes (сериализатор, десериализатор):

Есть несколько примеров существующих модулей serdes для Python, но в голову приходит JSON, но проблема в том, что он очень специфичен и не поддерживает произвольные форматы. Вы можете кодировать или декодировать JSON, вот и все. Существует множество различных типов, некоторые из которых используют методы load, * dumps *, некоторые - нет. Это дрянь.

objects = json.loads('{'a': 1, 'b': 2})


шаблон посетителя (?):

Я не очень хорошо знаком с шаблоном посетителя, но, похоже, у него есть некоторые механизмы, которые могут быть применимы - идея заключается в том, что (если я правильно понимаю) вы бы настроили посетителя для узлов, и он прошел бы дерево и применить некоторые преобразования (и вернуть новые объекты?).. Я здесь туманно.


Другой?:

Есть ли другие механизмы, которые могут быть более питоническими или уже написаны? Возможно, я подумал об использовании ElementTree и создании подклассов Elements - но я хотел бы обратиться к stackru, прежде чем делать что-то глупое.

0 ответов

Другие вопросы по тегам