在cython中,自动完成int或char等类型的编组, 但如果我使用
cdef struct MyClass_Tag:
pass
ctypedef MyClass_Tag* MyClass_ptr
....
cdef class MyClass:
cdef MyClass_ptr obj
....
现在包装任何函数,例如c中的函数foo,需要
foo(char* , MyClass_ptr self)
#return stuff
要包装此功能,我会这样做:
def py_foo(char* n, self):
return foo(n,self.obj)
所以从py到c:
char is done automatically
but self is of type MyClass so to call the foo i have to write self.obj ,
so i pass the same obj
这里是从py到c的编组发生的地方
问题是我不明白从c到py的编组在哪里发生, 我的意思是它发生在哪一点?
即使在这种情况下,即使你给我一些其他的例子也没关系。 谢谢!
答案 0 :(得分:0)
我没有完全理解你的问题,但你可能想要使用命令:
cython -a <yourfile.pyx>
然后,使用您的webbrowser打开生成的内容。你会看到cython如何将你的代码翻译成C,然后找到你的答案:)
答案 1 :(得分:0)
由于参数名self
表明C foo()
函数作为Python中的方法可能更有意义:
cdef extern void c_foo "foo" (char* n, MyClass_ptr)
cdef class MyClass:
cdef MyClass_ptr this
def foo(self, unicode n not None):
b = n.encode('ascii')
cdef char* p = b
c_foo(p, self.this)
Cython将您的代码转换为C(或C ++)。此时你可以忘记它的存在。生成的C代码是Python的普通C扩展。此代码包含普通的Python C API调用,例如PyBytes_AsString()
(将Python bytes
转换为char*
)或PyInt_FromLong()
(将C int
转换为Python整数)。 / p>
MyClass_ptr
按原样使用:
struct __pyx_obj_3foo_MyClass {
PyObject_HEAD
MyClass_ptr this; /* <-- using MyClass_ptr as is */
};
,即纯Python代码永远不会看到它,所以没有从/到Python对象的转换。