cdef extern from "Foo.h":
cdef cppclass Bar:
pass
cdef class PyClass:
cdef Bar *bar
def __cinit__(self, Bar *b)
bar = b
这将总是给我一些类似的东西:
Cannot convert Python object argument to type 'Bar *'
有没有办法做到这一点,或者我是否需要从Bar
对象中提取所有内容,创建一个Python等效项,传递给它,然后在PyClass
中重新构造它
发布于 2014-05-02 04:33:15
我在尝试用结构将C代码包装为python类时遇到了这个问题。问题似乎是,包括__init__
和__cinit__
在内的“特殊”函数必须声明为def
而不是cdef
。这意味着它们可以从普通的python中调用,所以类型参数实际上被忽略了,所有的东西都被当作对象来处理。
在J.F.Sebastian的回答中,修复方法不是包装- double是一种基本的数字类型,因此在C/C++类型和Python对象之间存在默认转换。Czarek的答案基本上是正确的--你需要使用一个假的构造函数,使用一个全局函数。不能使用@staticmethod修饰器,因为它们不能应用于cdef函数。在提供的原始示例中,答案看起来更简单。
cdef extern from "Foo.h":
cdef cppclass Bar:
pass
cdef class PyClass:
cdef Bar *bar
cdef PyClass_Init(Bar *b):
result = PyClass()
result.bar = b
return result
发布于 2015-09-27 20:08:41
在Cython 0.21中,可以使用@staticmethod
装饰器来声明cdef
方法。这允许静态创建者方法接受非Python参数:
cdef extern from "Foo.h":
cdef cppclass Bar:
pass
cdef class PyClass:
cdef Bar *bar
@staticmethod
cdef create(Bar *bar):
cdef PyClass pc = PyClass()
pc.bar = bar
return pc
发布于 2012-08-31 04:55:40
对于每个cdef类,创建一个充当构造函数的全局cdef函数,CefResponse是一个C++对象,PyResponse是c++对象的python等效项:
cdef object CreatePyResponse(CefRefPtr[CefResponse] cefResponse):
pyResponse = PyResponse()
pyResponse.cefResponse = cefResponse
return pyResponse
cdef class PyResponse:
cdef CefRefPtr[CefResponse] cefResponse
def GetStatus(self):
return (<CefResponse*>(self.cefResponse.get())).GetStatus()
所以调用resp = CreatePyResponse(cppObject)
而不是resp = PyResponse(cppObject)
。
取自CEF Python的示例:https://code.google.com/p/cefpython/source/browse/cefpython/response.pyx?r=0250b65e046a
https://stackoverflow.com/questions/12204441
复制相似问题