问题包装Patricia尝试使用Swig,python

时间:2009-03-23 17:52:17

标签: python c pointers swig

我正在尝试将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指针对象。

问题:

  1. 我是否理解正确?
  2. 我该如何解决这个问题? %是否延伸?类型表?细节会非常有用。
  3. 注意:

    1. 我无法更改C源代码,但我可以在其他.h文件或接口.i文件中扩展它。
    2. 根据我的理解,“数据”字段应该能够包含“任何”的“任何东西”,以获得我真正不知道的“任何”的合理价值。

3 个答案:

答案 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,它使用相同的底层代码。