我有一个像这样的Pyrex扩展类型:
cdef extern from "some_include.h":
ctypedef struct AThing:
...
它由Pythoninc扩展类型包装:
cdef class Foo:
cdef AThing c_val
def __init__(self, somestring):
self.c_val = from_string(somestring)
我希望能够在其他地方的Pyrex代码中使用现有的C值创建此扩展类型的实例,如下所示:
cdef some_func(avalue):
cdef AThing val
...
val = some_func()
a_dict['foo'] = Foo()
a_dict['foo'].c_val = val
...但这会导致“无法将'AThing'转换为Python对象”。创建可以从Python和C初始化的Pyrex扩展类型的一般技术是什么?
答案 0 :(得分:2)
我想出来了。我的问题是我这样做:
rv = {}
rv['val'] = ExtensionType()
rv['val'].c_attr = val
这不起作用,因为rv ['val']现在是一个python对象,所以你无法访问cdef attrs。你需要使用一个中间的cdef,比如这个
cdef ExtensionType tmpvar
rv = {}
tmpvar = ExtensionType()
tmpvar.c_attr = val
rv['val'] = tmpvar