2011-10-30 19 views
7

In una struttura ctypes, è possibile specificare valori predefiniti?Valori predefiniti in un ctypes Struttura

Ad esempio, con una funzione di pitone regolare, si può fare questo:

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

che permetterebbe di questo comportamento:

func(1) # prints 3 

func(1, 20) # prints 21 

func(1, b=50) # prints 51 

E 'possibile farlo in una struttura ctypes?

ad esempio:

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 

risposta

7

Sì. Basta sostituire il metodo __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

Grazie! Non sono sicuro del perché non ci ho pensato. :) –

3

Esiste un modo più comodo se si dispone di molte strutture con valori predefiniti diversi da quelli di tipo ctypes. Espandi il ctypes.Structure in un'altra variabile di classe _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

Si dice "Python 3 syntax" - quale sarebbe l'equivalente in Python 2.7? – slhck

+0

In Python 2 devi ripetere te stesso: '' 'super (YourStructure, self) .__ init __ (** values)' '' (http://stackoverflow.com/a/576183/2053808). – Chickenmarkus

Problemi correlati