如何在施工时指定工会价值

时间:2013-10-15 00:16:13

标签: python union ctypes

我试图通过ctypes将一个联合数组传递给我的C ++ DLL,我对Python很新。是否有构建它们的简便方法,例如:

class MyValue(Union):
  _fields_ = [
    ("ftNone"  , c_void_p),
    ("ftString", c_char_p),
    ("ftInt"   , c_int   ),
    ("ftBigInt", c_long  ),
    ("ftFloat" , c_char_p)
  ]
MyValues = MyValue * 20

CMethod(MyValues(
 ('ftInt'    = 12),
 ('ftString' = 'testing')
))

或者有更好的方法吗?我基本上想要将一个混合类型数组传递给我的DLL。

1 个答案:

答案 0 :(得分:1)

使用位置参数初始化ctypes数组。初始值可以是ctypes数据对象,与简单数据类型兼容的Python对象(对于诸如c_int * 20的简单类型的数组),或者用于创建数组的临时实例的位置参数元组要复制的数据类型(memcpy)到数组中。

由于您需要一个关键字参数来选择正确的转换器,您必须调用MyValue来手动创建临时实例,或者在单元化数组的每个项目上调用setattr。对于前者,您可以使用生成器表达式结合***解包(请参阅tutorial):

values = [
    ('ftInt', 12),
    ('ftString', 'testing'),
]

arr = MyValues(*(MyValue(**{k: v}) for k, v in values))

这是使用setattr在循环中更新数组的替代方法:

arr = MyValues()
for item, value in zip(arr, values):
    setattr(item, *value) # note the * unpacking

_PyCData_set(Modules / ctypes / _ctypes.c)中添加对关键字参数dict的支持会很不错。