2011-10-30 11 views
7

Bir klişenin Yapısı, varsayılan değerleri belirtmek mümkün mü? Düzenli piton fonksiyonlu Örneğin Bir klişedeki varsayılan değerler Yapı

, bunu yapabilirsiniz:

def func(a, b=2): 
    print a + b 
bu davranışı için izin verecek

:

func(1) # prints 3 

func(1, 20) # prints 21 

func(1, b=50) # prints 51 

bir ctypes Yapısı bunu yapmak mümkün mü? örneğin

:

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 

cevap

7

Evet. Sadece __init__ yöntemini geçersiz kılın.

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

Teşekkürler! Bunu neden düşünmediğime emin değilim. :) –

3

Varsayılan değerlere sahip, çok fazla yapıya sahip olan çok sayıda yapı varsa, daha rahat bir yol var. Ctrpes.Structure öğesini başka bir sınıf değişkeni _defaults_'a genişletin.

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 sözdizimi" diyorsunuz - Python 2.7'deki eşdeğer nedir? – slhck

+0

Python 2'de kendinizi tekrar etmeniz gerekir: '' 'super (YourStructure, self) .__ init __ (** values)' '(http://stackoverflow.com/a/576183/2053808). – Chickenmarkus