2011-10-30 11 views
7

एक प्रकार के संरचना में, क्या डिफ़ॉल्ट मान निर्दिष्ट करना संभव है?एक प्रकार के आकार में डिफ़ॉल्ट मान संरचना

उदाहरण के लिए, एक नियमित रूप से अजगर समारोह के साथ, आप ऐसा कर सकते हैं:

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__ विधि को ओवरराइड करें। यदि आप मूलभूत मूल्यों ctypes 'वालों के लिए अलग से संरचनाओं की एक बहुत कुछ है

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 का विस्तार करें। किसी अन्य वर्ग चर के लिए संरचना _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

आप कहते हैं "पायथन 3 वाक्यविन्यास" - पायथन 2.7 में बराबर क्या होगा? – slhck

+0

पायथन 2 में आपको खुद को दोहराना होगा: '' 'सुपर (आपका संरचना, स्वयं) .__ init __ (** मान)' '' (http://stackoverflow.com/a/576183/2053808)। – Chickenmarkus

संबंधित मुद्दे