I have a structure with different datatype fields. I would like to iterate through the structure fields, check the datatype, and set the field with an appropriate value.
This doesn't appear to be supported in the ctypes API. When the Field
repr
is created, the name is retrieved from the embedded type like this:
name = ((PyTypeObject *)self->proto)->tp_name;
For your field the member self->proto
points to c_long
, yet I find no place in Python 2.7's cfield.c where you can retrieve the value of self->proto
itself. You may be forced either to:
name
-> type
. and use getattr(ctypes, X)
to fetch the type object.
Just to follow up with an example of option (1), here's a class decorator which creates the type mapping for you, adding a _typeof(cls, fld)
class method:
from ctypes import *
def typemap(cls):
_types = dict((getattr(cls, t), v) for t, v in cls._fields_)
setattr(cls, '_typeof', classmethod(lambda c, f: _types.get(f)))
return cls
@typemap
class A(Structure):
_fields_ = [("one", c_long),
("two", c_char),
("three", c_byte)]
print A._typeof(A.one), A._typeof(A.two), A._typeof(A.three)
Result: