Существует способ, чтобы инициализировать структуру со словарем:Python CFFI преобразовать структуру в словаре
fooData= {'y': 1, 'x': 2}
fooStruct = ffi.new("foo_t*", fooData)
fooBuffer = ffi.buffer(fooStruct)
Есть некоторые готовые функции для выполнения преобразования?
fooStruct = ffi.new("foo_t*")
(ffi.buffer(fooStruct))[:] = fooBuffer
fooData= convert_to_python(fooStruct[0])
Должен ли я использовать ffi.typeof ("foo_t"). Поля самостоятельно?
Я придумал этот код до сих пор:
def __convert_struct_field(s, fields):
for field,fieldtype in fields:
if fieldtype.type.kind == 'primitive':
yield (field,getattr(s, field))
else:
yield (field, convert_to_python(getattr(s, field)))
def convert_to_python(s):
type=ffi.typeof(s)
if type.kind == 'struct':
return dict(__convert_struct_field(s, type.fields))
elif type.kind == 'array':
if type.item.kind == 'primitive':
return [ s[i] for i in range(type.length) ]
else:
return [ convert_to_python(s[i]) for i in range(type.length) ]
elif type.kind == 'primitive':
return int(s)
Есть ли более быстрый способ?
Нет встроенного способа, нет. Обычно это не нужно: просто используйте объект cdata напрямую, не переведя его сначала в словари и списки. –
@ArminRigo Мне нужно преобразовать его в JSON. – Arpegius