2012-02-17 9 views
4

をこれは動作しません:設定ctypes.Structureのデフォルト値

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

それがエラーをして:

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__()に値を設定することができますしかし

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__ですか?

+0

少なくとも2つの解決策がここにあります:http://stackoverflow.com/questions/7946519/default-values-in-a-ctypes-structure – Chickenmarkus

答えて

2

ctypes.c_uint(0xFFFFFFFF)はタイプではないため、例のエラーです。クラス定義では、すべてが型でなければなりません(ポインタはPOINTERではなく、pointerです)。

__init__私はちょうどいい場合は使用すると思います。私は実際に大きな構造体をラップして、通常はデフォルト値を設定したように__init__を使用します。

一般に、あなたがラッピングしているCライブラリのコントロールを持っているなら、両方の場所(CとPython)でデフォルト設定をしてはいけないと思います。 1つの大きなライブラリでは、私がCにアクセスできる場所をラップして、__init__から呼び出すC関数 "set_defaults"を作成しました。この方法では、Cユーザーのみがデフォルトにアクセスでき、維持するコードは1セットだけです。

関連する問題