You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含嵌套结构与数组的Ctypes结构体转换为Python字典

重构ctypes结构体转Python字典的函数

需求说明

我有一个支持嵌套结构体、数组及结构体数组的ctypes结构体,需要重构已有的转换函数,要求:

  • 输入始终为ctypes.Structure,输出始终为Python字典
  • 递归遍历所有嵌套结构与数组
  • 将所有数组转换为以特定字符串(如index_0、index_1)为键的字典
  • 简化原有的繁琐实现,同时支持在函数内部向输出添加额外数据

原有实现代码

def _process_ctypes(self, ctypes_obj):
    if isinstance(ctypes_obj, ctypes.Structure):
        data_dict = {}
        for field_name, field_type in ctypes_obj.get_fields():
            field_value = getattr(ctypes_obj, field_name)
            if isinstance(field_value, (ctypes.Structure, ctypes.Array)):
                data_dict[field_name] = self._process_ctypes(field_value)
            else:
                data_dict[field_name] = field_value
        return data_dict
    elif isinstance(ctypes_obj, ctypes.Array):
        data_list = []
        for element in ctypes_obj:
            if isinstance(element, (ctypes.Structure, ctypes.Array)):
                data_list.append(self._process_ctypes(element))
            else:
                data_list.append(element)
        return data_list

重构后的实现

def struct_to_dict(self, struct_obj):
    def _convert(obj):
        # 递归处理结构体
        if isinstance(obj, ctypes.Structure):
            result = {}
            for field_name, _ in obj.get_fields():
                result[field_name] = _convert(getattr(obj, field_name))
            # 可在此添加额外数据,例如结构体名称
            # result["_struct_type"] = type(obj).__name__
            return result
        # 将数组转换为带索引键的字典
        elif isinstance(obj, ctypes.Array):
            return {f"index_{i}": _convert(item) for i, item in enumerate(obj)}
        # 基础数据类型直接返回
        else:
            return obj

    # 校验输入类型
    if not isinstance(struct_obj, ctypes.Structure):
        raise TypeError("输入必须是ctypes.Structure类型")
    return _convert(struct_obj)

重构亮点

  • 精简递归逻辑:用内部函数_convert统一处理所有类型,消除重复的循环和判断代码
  • 数组格式转换:通过字典推导式直接生成符合要求的索引键字典,无需额外循环处理
  • 灵活扩展:在结构体处理分支中可直接添加自定义字段,满足内部追加数据的需求
  • 输入合法性校验:确保只有ctypes.Structure类型能进入转换流程,避免非法输入
  • 可读性提升:代码结构分层清晰,逻辑一目了然

内容的提问来源于stack exchange,提问作者Mika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:44:55