设置ctypes.Structure默认值

时间:2012-02-17 20:14:52

标签: python ctypes

这不起作用:

class ifinfomsg(ctypes.Structure):
    _fields_ = [
                 ('ifi_family',  ctypes.c_ubyte),
                 ('__ifi_pad',   ctypes.c_ubyte),
                 ('ifi_type',    ctypes.c_ushort),
                 ('ifi_index',   ctypes.c_int),
                 ('ifi_flags',   ctypes.c_uint),
                 ('ifi_change',  ctypes.c_uint(0xFFFFFFFF))
               ]

错误:

  File "rtnetlink.py", line 243, in <module>
    class ifinfomsg(ctypes.Structure):
TypeError: Error when calling the metaclass bases
    second item in _fields_ tuple (index 5) must be a C type

但是我可以在__init__()中设置值:

class ifinfomsg(ctypes.Structure):
    _fields_ = [
                 ('ifi_family',  ctypes.c_ubyte),
                 ('__ifi_pad',   ctypes.c_ubyte),
                 ('ifi_type',    ctypes.c_ushort),
                 ('ifi_index',   ctypes.c_int),
                 ('ifi_flags',   ctypes.c_uint),
                 ('ifi_change',  ctypes.c_uint)
               ]

    def __init__(self):
        self.__ifi_pad = 0
        self.ifi_change = 0xFFFFFFFF

这是通过__init__吗?

执行此操作的“正确”方式

1 个答案:

答案 0 :(得分:2)

您的示例错误,因为ctypes.c_uint(0xFFFFFFFF)不是类型。在类定义中,一切都必须是一个类型(指针是POINTER而不是pointer)。

我认为你使用的__init__方法就好了。我已经包装了一些非常大的结构,通常使用__init__就像你设置默认值一样。

一般情况下,如果你控制了你正在包装的C库,我认为你不应该在两个地方(C和Python)都有默认设置。在我访问C的一个大型库中,我创建了C函数“set_defaults”,我从__init__调用了它。这样C只有用户才能访问默认值,并且只有一组代码需要维护。