Проблемы с упаковкой Патрисии Трис с использованием Swig, python

1

Я пытаюсь обернуть Patricia Tries (Perl NET:: Patricia), который будет показан на python. У меня возникают трудности с одним из классов.

Таким образом, patricia node (ниже), если смотреть с python, имеет свойство data. Чтение идет нормально, но запись на него прерывается.

typedef struct _patricia_node_t {
   u_int bit;           /* flag if this node used */
   prefix_t *prefix;        /* who we are in patricia tree */
   struct _patricia_node_t *l, *r;  /* left and right children */
   struct _patricia_node_t *parent;/* may be used */
   void *data;          /* pointer to data */
   void *user1;         /* pointer to usr data (ex. route flap info) */
} patricia_node_t;

В частности:

>>> N = patricia.patricia_node_t()
>>> assert N.data == None
>>> N.data = 1
TypeError: in method 'patricia_node_t_data_set', argument 2 of type 'void *'

Теперь мой C слаб. Из того, что я читал в книге SWIG, я думаю, это означает, что мне нужно передать ему указатель на данные. Согласно книга:

Кроме того, если вам нужно передать значение необработанного указателя в некоторую внешнюю библиотеку python, вы можете сделать это, наведя объект-указатель на целое число... Однако обратная операция невозможна, т.е. вы не можете постройте объект указателя Swig из значения целого целого.

Вопросы:

  • Я правильно понимаю это?
  • Как мне обойти это? Происходит ли%? TypeMap? Специфика будет очень полезна.

Примечания:

  • Я не могу изменить источник C, но я могу расширить его в дополнительных файлах .h или в файле .i.
  • Из того, что я понимаю, это поле данных должно содержать "что угодно" для некоторой разумной ценности "ничего", о которой я действительно не знаю.
Теги:
pointers
swig

3 ответа

1

Я не использовал SWIG через некоторое время, но я уверен, что вы хотите использовать типовую карту, которая займет PyObject*, и отбросит ее до требуемого void* и наоборот. Разумеется, обязательно отслеживайте количество ссылок.

0

Альтернативой является использование PyRadix, в котором используется тот же базовый код.

0

Похоже, вы должны передать SWIG указателю на целое число. Например, если это все в C, ваша ошибка будет такой:

void set(struct _patricia_node_t *tree, void *data) {
     tree->data = data;
}

...

int value = 1;
set(tree, &value); // OK! HOORAY!
set(tree,  value); // NOT OK! FIRE SCORPIONS!

И мне кажется, что вы выполняете эквивалент Python set(tree, value). Теперь я не специалист по SWIG, но, возможно, вы могли бы передать кортеж вместо целого числа? Работает ли N.data = (1,)? Это был ответ, предложенный Allegro CL + SWIG, но я не знаю, насколько он применим к Python.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню