2013-12-07 1 views
4

Существует способ, чтобы инициализировать структуру со словарем: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) 

Есть ли более быстрый способ?

+0

Нет встроенного способа, нет. Обычно это не нужно: просто используйте объект cdata напрямую, не переведя его сначала в словари и списки. –

+1

@ArminRigo Мне нужно преобразовать его в JSON. – Arpegius

ответ

0

Ваш код в порядке.

Даже если бы в CFFI был встроенный способ, это не то, что вам нужно здесь. Действительно, вы можете сказать ffi.new("foo_t*", {'p': p1}), где p1 - это еще одна cdata, но вы не можете рекурсивно передавать словарь, содержащий больше словарей. То же самое можно сказать и в обратном направлении: вы получите словарь, который отображает имена полей в «значения», но сами значения будут больше объектами cdata, а не рекурсивно больше словарей.

+0

Ничего себе я не знал, даже не проверял. Надеюсь, не было структур с полями структуры, переходя к C. В любом случае я оставляю этот вопрос открытым, возможно, кто-то делает эту функциональность в следующей версии cffi. – Arpegius

Смежные вопросы