如何在构造时指定并集值

2024-04-19 13:44:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过CyType将一系列的联盟传递给我的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。你知道吗


Tags: 方法fieldsclassintdllunioncharvoid
1条回答
网友
1楼 · 发布于 2024-04-19 13:44:28

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))

下面是另一种使用^{}更新循环中数组的方法:

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

最好在^{}(Modules/ctypes/\u ctypes.c)中添加对关键字参数dict的支持。你知道吗

相关问题 更多 >