【问题标题】:problems Wrapping Patricia Tries using Swig, python使用 Swig、python 包装 Patricia 尝试的问题
【发布时间】:2009-03-23 17:52:17
【问题描述】:

我正在尝试包装 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 书中读到的内容,我认为这意味着我需要向它传递一个指向数据的指针。根据the book

另外,如果你需要将原始指针值传递给一些外部 python 库,你可以通过将指针对象转换为整数来实现...但是,逆运算是不可能的,即你不能从原始整数值构建一个 Swig 指针对象。

问题:

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

注意事项:

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

【问题讨论】:

    标签: python c pointers swig


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      看起来您应该向 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 的适用程度。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多