Из комментария OP Я думаю, что минимальное решение представляет собой набор вспомогательных функций вместо классов. библиотека xmltodict позволяет легко превратить XML-данные в вложенные словари, более или менее похожие на JSON. Набор помощников, которые анализируют содержимое и генерируют соответствующие строки C-struct, - это все, что действительно необходимо. Если вы можете работать со словарями:
{
"name": "my_struct",
"members": {
[
"name": "intmember",
"ctype": "int"
},
{
"name": "floatmember",
"ctype": "float"
}
]
}
Вы можете сделать что-то вроде:
from string import Template
struct_template_string = '''
typedef $structname struct {
$defs
} $structname;
'''
struct_template = Template(struct_template_string)
member_template = Template(" $ctype $name;")
def spec_to_struct(spec_dict):
structname = spec_dict['name']
member_data = spec_dict['members']
members = [member_template.substitute(d) for d in member_data]
return struct_template.substitute(structname = structname, defs = "\n".join(members))
Который будет производить что-то вроде:
typedef my_struct struct {
int intmember;
float floatmember;
} my_struct;
Я бы попытаться получить его работу с основным прежде чем пытаться создать классный эшафот. Было бы довольно легко скрыть детали в классе, используя дескрипторы свойств:
class data_property(object):
def __init__(self, path, wrapper = None):
self.path = path
self.wrapper = wrapper
def __get__(self, instance, owner):
result = instance[self.path]
if self.wrapper:
if hasattr(result, '__iter__'):
return [self.wrapper(**i) for i in result]
return self.wrapper(**result)
return result
class MemberWrapper(dict):
name = data_property('name')
type = data_property('ctype')
class StructWrapper(dict):
name = data_property('name')
members = data_property('members', MemberWrapper)
test = StructWrapper(**example)
print test.name
print test.members
for member in test.members:
print member.type, member.name
# my_struct
# [{'name': 'intmember', 'ctype': 'int'}, {'name': 'floatmember', 'ctype': 'float'}]
# int intmember
# float floatmember
Являются ли эти данные непосредственно связанными с структурами C, которые вы хотите испустить? Как это набор определений структур в XML? Или это данные реального мира, которые вы хотите проанализировать и использовать для создания структурных определений на основе собственного анализа? – theodox
Это определения регистров для некоторых HW. Я хочу, чтобы C Structs отображали HW, и я хочу, чтобы классы Python имели одинаковые имена полей и т. Д. – ChipJust
1. Не могли бы вы дать контекст? 2. Вы хотите только генерировать исходный код? 3. Можете ли вы показать пример XML, Python, C? – User