1

我正在尝试包装 Patricia Tries(Perl 的 NET::Patricia)以在 python 中公开。我在其中一门课上遇到困难。

因此,从 python 中查看的 patricia 节点(下图)的实例具有“数据”属性。阅读它很好,但写入它会中断。

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来自原始整数值的指针对象。

问题:

  1. 我理解正确吗?
  2. 我该如何解决这个问题?% 扩展了吗?打字机?细节会很有帮助。

笔记:

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

3 回答 3

1

我有一段时间没有使用 SWIG,但我很确定您想要使用一个类型映射,它将采用 aPyObject*并将其转换为所需的类型void*,反之亦然。当然,一定要跟踪引用计数。

于 2009-08-26T20:58:55.633 回答
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 的适用程度如何。

于 2009-03-23T19:25:06.283 回答
0

另一种方法是使用PyRadix,它使用相同的底层代码。

于 2010-01-26T19:19:06.267 回答