Шаблоны для преобразования объектов 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, прежде чем делать что-то глупое.