Я написал расширение Python для библиотеки C. У меня есть структура данных, которая выглядит следующим образом:
typedef struct _mystruct{
double * clientdata;
size_t len;
} MyStruct;
Назначение этого типа данных напрямую соответствует типу данных списка в Python. Поэтому я хочу создать поведение, подобное списку, для экспортируемой структуры, чтобы код, написанный с использованием моего расширения C, был более «Pythonic».
В частности, это то, что я хочу делать (из кода Python) Примечание: py_ctsruct - это тип данных ctsruct, доступ к которому осуществляется в python.
Мои требования можно резюмировать следующим образом:
Согласно PEP234 , Объект можно повторять с помощью «for», если он реализует _ iter _ () или _ getitem _ () . Тогда, используя эту логику, я думаю, что, добавив следующие атрибуты (через переименовать ) в мой файл интерфейса SWIG, я получу желаемое поведение (кроме требования №1 выше, которое я до сих пор не знаю, как для достижения):
__len__
__getitem__
__setitem__
Теперь я могу индексировать объект C в python.Я еще не реализовал выдачу исключений Python, однако, если границы массива превышены, возвращаются магические числа (код ошибки).
Интересно то, что когда я пытаюсь перебрать структуру, используя, например, синтаксис «for x in»:
for i in py_cstruct:
print i
Python входит в бесконечный цикл, который просто выводит на консоль упомянутый выше магический (ошибочный) номер . что наводит на мысль, что с индексацией что-то не так.
И последнее, но не менее важное: как я могу реализовать требование 1? это включает (насколько я понимаю):
[[Обновление]]
Мне было бы интересно увидеть небольшой фрагмент кода о том, какие объявления (если они есть) мне нужно поместить в файл интерфейса, чтобы я мог перебирать элементы c struct из Python.