【问题标题】:XML to Python Class to C StructXML 到 Python 类到 C 结构
【发布时间】:2015-07-17 23:34:23
【问题描述】:

我需要一些建议。两个问题,这是否已经存在,我应该使用哪些模块来开发它。

我有一些来自 XML 文件的结构。我想在 Python 类中表示它们(也许使用工厂为每个结构创建一个类)。但我希望这些类有一个函数,可以将结构作为 C 结构发出。

根据我的研究,ctypes 似乎是用于表示 Python 类中的结构的推荐方法,但我没有看到任何方法可以发出 C Stucts 以创建头文件。

【问题讨论】:

  • 此数据是否与您要发出的 C 结构直接相关?就像它是一组 XML 中的结构定义?或者是您想要分析的真实世界数据,并根据您自己的一些分析来创建结构定义?
  • 它们是一些硬件的寄存器定义。我想要反映硬件的 C 结构,我想要 Python 类具有相同的字段名称等。
  • 1.你能给出一个上下文吗? 2.你只想生成源代码吗? 3. 你能展示 XML、Python、C 的例子吗?
  • 不完全符合您的要求,但密切相关:将 XML 已知结构(在示例中为 android-localiztion 文件)转换为 C 结构 - 请参阅 github.com/E-Brons/localization_xml_to_c

标签: python struct bit-fields


【解决方案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

【讨论】:

    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2011-08-29
    相关资源
    最近更新 更多