Это не поддерживается в API ctypes. Когда создается Field
repr <Field type=c_long ..>
, имя извлекается из встроенного типа следующим образом:
name = ((PyTypeObject *)self->proto)->tp_name;
Для вашего поля член self->proto
указывает на c_long
, но я не нахожу места в Python 2.7 cfield.c
, где вы можете получить значение self->proto
. Вас могут заставить либо:
- Создайте свое собственное отображение из
name
-> type
.
- (yuck) Разобрать repr для
<Field type=X
и использовать getattr(ctypes, X)
для извлечения объекта типа.
Просто чтобы продолжить пример option (1) , вот декоратор класса, который создает для вас отображение типа, добавив _typeof(cls, fld)
метод класса:
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)
Результат:
<class 'ctypes.c_long'> <class 'ctypes.c_char'> <class 'ctypes.c_byte'>