我正在尝试将Patricia Tries(Perl的NET :: Patricia)包装在python中。我对其中一个课程有困难。
因此,从python中查看的patricia节点(下面)具有“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书中看到的内容来看,我认为这意味着我需要传递一个指向数据的指针。根据{{3}}:
另外,如果你需要将原始指针值传递给某个外部python库,你可以通过将指针对象转换为整数来实现...但是,逆操作是不可能的,即你不能从原始整数值构建Swig指针对象。
问题:
注意:
答案 0 :(得分:1)
我暂时没有使用过SWIG,但我很确定你想要使用一个类型图,它将PyObject*
转换为所需的void*
,反之亦然。当然,请务必跟踪参考计数。
答案 1 :(得分: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!
在我看来,你正在做与set(tree, value)
相当的Python。现在我不是SWIG的专家,但也许你可以传递元组而不是整数? N.data = (1,)
有用吗?这是Allegro CL + SWIG示例所建议的答案,但我不知道它对Python有多好。
答案 2 :(得分:0)
另一种方法是使用PyRadix,它使用相同的底层代码。