我有一个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中是不可能的,但是在这种情况下会发生什么? 使用安全吗?
答案 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;
};
使用它没有危险。