¿Usando __repr__() en una subclase de ctypes?

Estoy jugando un poco con ctypes para masajear un código C que escribí en Python. El código C se basa en gran medida en estructuras y uniones, y por ahora, la solución rápida en Python es subclasificarlas a través de ctypes:

Es decir, de esto:

struct foo {
    uint32_t a;
    uint32_t b;
    uint16_t c;
    uint16_t d;
};


A esto:

from ctypes import *

class Foo(Structure):
    _fields_ = [("a", c_uint),
                ("b", c_uint),
                ("c", c_ushort),
                ("d", c_ushort)]

Excepto, si lanzo un __repr__() definición en la clase Python y luego usar repr() en una instancia, todo lo que obtengo es <class 'Foo'> (o algo por el estilo, recordando un poco aquí).

Así que me pregunto si hay una manera de utilizar repr() y tratar de obtener lo mejor de ambos mundos entre Python y C, o si debo mirar las metaclases y usar el struct biblioteca para empaquetar/desempaquetar bytes en las clases de Python adecuadas.

Pensamientos

preguntado el 22 de mayo de 12 a las 20:05

1 Respuestas

Realmente no entiendo el problema. Esto funciona bien:

from ctypes import *

class Foo(Structure):
    _fields_ = [("a", c_uint),
                ("b", c_uint),
                ("c", c_ushort),
                ("d", c_ushort)]

    def __repr__(self):
        return "<Foo: a:%d b:%d c:%d e:%d>" % (self.a, self.b, self.c, self.d)

f = Foo(1,2,3,4)
print repr(f)

# <Foo: a:1 b:2 c:3 e:4>

solo si lo haces:

print repr(Foo)

terminarás con

<class '__main__.Foo'>

o algo similar.

¿Estás seguro de que usas repr en una instancia?

contestado el 22 de mayo de 12 a las 21:05

Bueno, estoy haciendo esto en Python 2.4, después de crear manualmente ctypes para él. ¿Puede ser eso parte del problema? - Kumba

De alguna manera me parece poco probable, solo tried it en un servidor con python2.4 y funcionó. - mata

De acuerdo, atribuya esto a PEBKAC o PICNIC. estaba haciendo f=FooNO f=Foo(). Herp derp. - Kumba

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.