如何将含嵌套结构与数组的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
相关产品推荐
相关产品推荐

