2013-12-07 39 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