Интроспекция вложенных структур ctypes

Аналогично этому вопросу я хотел бы напечатать элементы структуры C из Python.

Я выполнил следующую функцию:

def print_ctypes_obj(obj, indent=0): for fname, fvalue in obj._fields_: if hasattr(fvalue, '_fields_'): print_ctypes_obj(fvalue, indent+4) else: print '{}{} = {}'.format(' '*indent, fname, getattr(obj, fname)) 

Идея состоит в том, что если само поле имеет атрибут _fields_ , то это структура, иначе нормальное поле так печатает. Рекурсия работает отлично, но после первого уровня я получаю распечатываемые строки вместо значений. Например:

 foo = 1
 bar = 2
 baz = 3
     innerFoo = <Тип поля = c_long, ofs = 0, size = 4>
     innerBar = <Тип поля = c_long, ofs = 4, size = 4>
     innerBaz = <Тип поля = c_long, ofs = 8, size = 4>
 quz = 4

Результат, который я ожидаю, будет примерно таким:

 foo = 1
 bar = 2
 baz = 3
     innerFoo = 5
     innerBar = 23
     innerBaz = 56
 quz = 4

Какая у меня ошибка?

Решение довольно простое.

При печати вложенных структур мне все равно нужно получить структуру как атрибут, поэтому ctypes может выполнять свою магию:

 print_ctypes_obj(getattr(obj, fname), indent+4) 

(другая проблема с кодом – это именование итерированных пар, они должны быть fname, ftype вместо fname, fvalue что неверно и вводит в заблуждение)