SWIG, связывающий библиотеку C с Python (создание «итеративного» типа данных Python из структуры C «последовательность»)

Я написал расширение Python для библиотеки C. У меня есть структура данных, которая выглядит следующим образом:

typedef struct _mystruct{
   double * clientdata;
   size_t   len;
} MyStruct;

Назначение этого типа данных напрямую соответствует типу данных списка в Python. Поэтому я хочу создать поведение, подобное списку, для экспортируемой структуры, чтобы код, написанный с использованием моего расширения C, был более «Pythonic».

В частности, это то, что я хочу делать (из кода Python) Примечание: py_ctsruct - это тип данных ctsruct, доступ к которому осуществляется в python.

Мои требования можно резюмировать следующим образом:

  1. list (py_ctsruct) возвращает список Python со всем содержимым, скопированным из структуры c
  2. py_cstruct [i] возвращает ith элемент (предпочтительно выдает IndexError при недопустимом индексе)
  3. для элемента в py_ctsruct: возможность перечисления

Согласно PEP234 , Объект можно повторять с помощью «for», если он реализует _ iter _ () или _ getitem _ () . Тогда, используя эту логику, я думаю, что, добавив следующие атрибуты (через переименовать ) в мой файл интерфейса SWIG, я получу желаемое поведение (кроме требования №1 выше, которое я до сих пор не знаю, как для достижения):

__len__
__getitem__
__setitem__

Теперь я могу индексировать объект C в python.Я еще не реализовал выдачу исключений Python, однако, если границы массива превышены, возвращаются магические числа (код ошибки).

Интересно то, что когда я пытаюсь перебрать структуру, используя, например, синтаксис «for x in»:

for i in py_cstruct:
    print i

Python входит в бесконечный цикл, который просто выводит на консоль упомянутый выше магический (ошибочный) номер . что наводит на мысль, что с индексацией что-то не так.

И последнее, но не менее важное: как я могу реализовать требование 1? это включает (насколько я понимаю):

  • обработка 'вызова функции list () из python
  • Возврат типа данных Python (список) из кода C

[[Обновление]]

Мне было бы интересно увидеть небольшой фрагмент кода о том, какие объявления (если они есть) мне нужно поместить в файл интерфейса, чтобы я мог перебирать элементы c struct из Python.

7
задан Homunculus Reticulli 12 January 2012 в 00:14
поделиться