在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
答案 0 :(得分: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)
答案 1 :(得分: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,
}