2011-10-30 20 views
7

En una estructura de ctypes, ¿es posible especificar valores predeterminados?Valores predeterminados en una estructura de ctypes

Por ejemplo, con una función de Python regular, usted puede hacer esto:

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

que permita este comportamiento:

func(1) # prints 3 

func(1, 20) # prints 21 

func(1, b=50) # prints 51 

¿Es posible hacer esto en una estructura ctypes?

por ejemplo:

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 

Respuesta

7

Sí. Simplemente anule el método __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

¡Gracias! No estoy seguro de por qué no pensé en eso. :) –

3

Hay una manera más cómoda si tiene muchas estructuras con valores por defecto diferentes a los de ctypes. Expanda ctypes.Structure a otra variable de clase _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

Dices "sintaxis de Python 3": ¿cuál sería el equivalente en Python 2.7? – slhck

+0

En Python 2 tiene que repetirse: '' 'super (YourStructure, self) .__ init __ (** values)' '' (http://stackoverflow.com/a/576183/2053808). – Chickenmarkus

Cuestiones relacionadas