Cython中的递归cdef类

时间:2018-07-31 20:49:37

标签: class recursion cython

我有一个python类,该类接受与参数相同类的对象。我认为不允许将其转换为Cython cdef类(扩展类型)。令人惊讶的是,它似乎有效。

cdef class NodeObject:
    cdef NodeObject parent

    @staticmethod
    cdef create_node(NodeObject parent=None):
        cdef NodeObject no=NodeObject()
        no.parent=parent
        return no

cdef NodeObject node_0=NodeObject.create_node()
cdef NodeObject node_1=NodeObject.create_node(parent=node_0)

print (node_0.parent,node_1.parent)

-----------------------------------------------------------
>>>"(None, <tests.NodeObject object at 0x00000203105BACC0>)"

我的问题: 我知道递归结构在C中是不可能的,但是在这种情况下会发生什么? 使用安全吗?

1 个答案:

答案 0 :(得分:2)

使用安全,因为cdef NodeObject parent是C级的指针。

struct Foo{
   struct  Foo a;
};
不允许使用

(因为sizeof(Foo)是什么?),完全可以使用指向Foo中的struct Foo对象的指针:

struct Foo{
   struct  Foo *a;
};

很容易说出Foo对象的大小:例如,在我的Linux64上,它是8个字节。

Cython翻译时

cdef class NodeObject:
    cdef NodeObject parent

struct __pyx_obj_5xxxxx_NodeObject {
  PyObject_HEAD
  struct __pyx_obj_5xxxxx_NodeObject *parent;
};

使用它没有危险。