Значения по умолчанию в структуре ctypes - PullRequest
7 голосов
/ 30 октября 2011

В структуре 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

Ответы [ 2 ]

7 голосов
/ 30 октября 2011

Да.Просто переопределите метод __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)
3 голосов
/ 17 сентября 2014

Есть более удобный способ, если у вас много структур со значениями по умолчанию, отличными от значений 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,
                 }
...