2015-07-17 2 views
0

Мне нужен совет. Два вопроса, что-то уже существует для этого, какие модули следует использовать для его разработки.XML-класс от Python до C Struct

У меня есть некоторые структуры, которые поступают из файла XML. Я хочу представить их в классах Python (возможно, используя фабрику для создания класса для каждой структуры). Но я хочу, чтобы эти классы имели функцию, которая будет излучать структуру как C Struct.

Из моего исследования ctypes кажется рекомендуемым элементом для представления структур в классах Python, но я не вижу никаких методов для чего-либо, что будет испускать C Stucts для создания файла заголовка.

+0

Являются ли эти данные непосредственно связанными с структурами C, которые вы хотите испустить? Как это набор определений структур в XML? Или это данные реального мира, которые вы хотите проанализировать и использовать для создания структурных определений на основе собственного анализа? – theodox

+0

Это определения регистров для некоторых HW. Я хочу, чтобы C Structs отображали HW, и я хочу, чтобы классы Python имели одинаковые имена полей и т. Д. – ChipJust

+0

1. Не могли бы вы дать контекст? 2. Вы хотите только генерировать исходный код? 3. Можете ли вы показать пример XML, Python, C? – User

ответ

1

Из комментария 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 
Смежные вопросы