2011-10-30 29 views
7

Trong cấu trúc ctypes, có thể chỉ định giá trị mặc định không?Giá trị mặc định trong một ctypes Cấu trúc

Ví dụ, với một hàm python thường xuyên, bạn có thể làm điều này:

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

Điều đó sẽ cho phép hành vi này:

func(1) # prints 3 

func(1, 20) # prints 21 

func(1, b=50) # prints 51 

Có thể làm điều này trong một cấu ctypes?

ví dụ:

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 

Trả lời

7

Yes. Chỉ cần ghi đè phương thức __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

Cảm ơn! Không chắc tại sao tôi không nghĩ về điều đó. :) –

3

Có một cách thoải mái hơn nếu bạn có nhiều cấu trúc với giá trị mặc định khác với các giá trị của ctypes '. Mở rộng ctypes.Structure sang biến lớp khác _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

Bạn nói "Python 3 cú pháp" - những gì sẽ tương đương trong Python 2,7 được? – slhck

+0

Trong Python 2 bạn phải lặp lại chính mình: '' 'super (YourStructure, self) .__ init __ (** values)' '' (http://stackoverflow.com/a/576183/2053808). – Chickenmarkus

Các vấn đề liên quan