Я пытаюсь обернуть 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 из значения целого целого.
Вопросы:
Примечания:
Я не использовал SWIG через некоторое время, но я уверен, что вы хотите использовать типовую карту, которая займет PyObject*
, и отбросит ее до требуемого void*
и наоборот. Разумеется, обязательно отслеживайте количество ссылок.
Альтернативой является использование PyRadix, в котором используется тот же базовый код.
Похоже, вы должны передать 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.