2011-10-30 28 views
7

ctypes構造では、デフォルト値を指定できますか?例えばctypesのデフォルト値構造

、通常のPythonの関数で、あなたがこれを行うことができます:

def func(a, b=2): 
    print a + b 

この動作を可能にする:

func(1) # prints 3 

func(1, 20) # prints 21 

func(1, b=50) # prints 51 

はctypesの構造でこれを行うには、それは可能ですか?例えば

class Struct(Structure): 
    _fields_ = [("a", c_int), ("b", c_int)] # b default should be 2 

    def print_values(self): 
     print self.a, self.b 

struct_instance = Struct(1) 

struct_instance.print_values() # should somehow print 1, 2 

答えて

7

はい。単に__init__メソッドをオーバーライドします。

class Struct(Structure): 
    _fields_ = [("a", c_int), ("b", c_int)] 

    def __init__(self, a, b=2): 
     super(Struct, self).__init__(a, b) 

    def print_values(self): 
     print(self.a, self.b) 
+0

ありがとうございます!なぜ私はそれを考えなかったのか分かりません。 :) –

3

ctypesのものと異なるデフォルト値を持つ構造がたくさんある場合、より快適な方法があります。 ctypes.Structureを別のクラス変数_defaults_に展開します。

class BaseStructure(ctypes.Structure): 

    def __init__(self, **kwargs): 
     """ 
     Ctypes.Structure with integrated default values. 

     :param kwargs: values different to defaults 
     :type kwargs: dict 
     """ 

     values = type(self)._defaults_.copy() 
     for (key, val) in kwargs.items(): 
      values[key] = val 

     super().__init__(**values)   # Python 3 syntax 



class YourStructure(BaseStructure): 
    _fields_ = [ ("param1", ctypes.c_uint32), 
       ("param2", ctypes.c_uint32), 
       ("param3", ctypes.c_int32), 
       ] 
    _defaults_ = { "param1" : 42, 
        "param3" : -23, 
       } 
+0

あなたは "Python 3構文"と言っています - Python 2.7で同等のものは何でしょうか? – slhck

+0

Python 2では、あなた自身を繰り返さなければなりません: '' 'super(YourStructure、self).__ init __(** values)' '(http://stackoverflow.com/a/576183/2053808)。 – Chickenmarkus

関連する問題