gpt4 book ai didi

Python CFFI 将结构转换为字典

转载 作者:太空狗 更新时间:2023-10-30 01:29:18 25 4
gpt4 key购买 nike

有一种方法可以用字典初始化结构:

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").fields 吗?

到目前为止我想出了这段代码:

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)

有没有更快的方法?

最佳答案

Arpegius 的解决方案对我来说效果很好,而且非常优雅。我根据 Selso 使用 inspect 的建议实现了一个解决方案。 dir() 可以代替 inspect。

from inspect import getmembers
from cffi import FFI
ffi = FFI()
from pprint import pprint

def cdata_dict(cd):
if isinstance(cd, ffi.CData):
try:
return ffi.string(cd)
except TypeError:
try:
return [cdata_dict(x) for x in cd]
except TypeError:
return {k: cdata_dict(v) for k, v in getmembers(cd)}
else:
return cd

foo = ffi.new("""
struct Foo {
char name[6];
struct {
int a, b[3];
} item;
} *""",{
'name': b"Foo",
'item': {'a': 3, 'b': [1, 2, 3]}
})
pprint(cdata_dict(foo))

输出:

{'item': {'a': 3, 'b': [1, 2, 3]}, 'name': b'Foo'}

关于Python CFFI 将结构转换为字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20444546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com