ctypes是否为枚举和标志提供了什么?

时间:2010-06-23 10:13:19

标签: python ctypes

我有一个我想在python中使用的API。该API包含使用#define实现的标志和枚举。

// it's just almost C so don't bother adding the typedef and parenthesis diarrhea here.
routine(API_SOMETHING | API_OTHERTHING)
stuff = getflags()
? stuff & API_SOMETHING

action(API_INTERESTING)
mode = getaction()
? mode == INTERESTING

如果现在忽略除枚举和标志之外的所有其他内容,我的绑定应将其转换为:

routine(["something", "otherthing"])
stuff = getflags()
if 'something' in stuff

action('interesting')
mode = getaction()
if mode == 'interesting'

ctypes是否提供直接执行此操作的机制?如果没有,那么就告诉你在python绑定中处理标志和枚举的“通常”工具。

2 个答案:

答案 0 :(得分:4)

我自己有点回答这个问题感到有点失望。特别是因为我从f *手册中找到了它。

http://docs.python.org/library/ctypes.html#calling-functions-with-your-own-custom-data-types

为了完成我的回答,我会写一些包装项目的代码。

from ctypes import CDLL, c_uint, c_char_p

class Flag(object):
    flags = [(0x1, 'fun'), (0x2, 'toy')]
    @classmethod
    def from_param(cls, data):
        return c_uint(encode_flags(self.flags, data))

libc = CDLL('libc.so.6')
printf = libc.printf
printf.argtypes = [c_char_p, Flag]

printf("hello %d\n", ["fun", "toy"])

encode_flags将那个漂亮的列表转换为整数。

答案 1 :(得分:3)

为什么不将c_uint用于enum参数,然后使用这样的映射(枚举通常是无符号整数值):

在C:

typedef enum {
  MY_VAR      = 1,
  MY_OTHERVAR = 2
} my_enum_t;

并在Python中:

class MyEnum():
    __slots__ = ('MY_VAR', 'MY_OTHERVAR')

    MY_VAR = 1
    MY_OTHERVAR = 2


myfunc.argtypes = [c_uint, ...]

然后,您可以将MyEnum字段传递给该函数。

如果您想要枚举值的字符串表示形式,可以在dictionary类中使用MyEnum