Проблемы с упаковкой Патрисии Трис с использованием Swig, python - PullRequest
1 голос
/ 23 марта 2009

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

Таким образом, экземпляры узла patricia (ниже), как видно из 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 *'

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

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

Вопросы:

  1. правильно ли я понимаю?
  2. как мне обойти это? % Расширяется? TypeMap? Подробности будут очень полезны.

Примечания:

  1. Я не могу изменить источник C, но могу расширить его в дополнительных файлах .h или в файле интерфейса .i.
  2. Из того, что я понимаю, это поле "данные" должно содержать "что-нибудь" для некоторого разумного значения "чего-либо", чего я действительно не знаю.

Ответы [ 3 ]

1 голос
/ 27 августа 2009

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

0 голосов
/ 26 января 2010

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

0 голосов
/ 23 марта 2009

Похоже, вы должны передать 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.

...