可能是这样:
def getdict(struct):
return dict((field, getattr(struct, field)) for field, _ in struct._fields_)
>>> x = S1()
>>> getdict(x)
{'A': <__main__.c_ushort_Array_10 object at 0x100490680>, 'C': 0L, 'B': 0L}
正如你所看到的,它可以处理数字,但是处理数组时就不那么顺畅了——你必须自己负责将数组转换为列表。一个更复杂的版本尝试着将数组转换为列表,代码如下:
def getdict(struct):
result = {}
for field, _ in struct._fields_:
value = getattr(struct, field)
if (type(value) not in [int, long, float, bool]) and not bool(value):
value = None
elif hasattr(value, "_length_") and hasattr(value, "_type_"):
value = list(value)
elif hasattr(value, "_fields_"):
value = getdict(value)
result[field] = value
return result
如果你拥有numpy
并且想要处理多维C数组,你应该添加import numpy as np
并修改:
value = list(value)
需要翻译的内容:
to:
value = np.ctypeslib.as_array(value).tolist()
这将为您提供一个嵌套列表。
dict
对象而不能只是将__getitem__()
等方法添加到你的结构类中吗? - llasram