如何使用多个构造函数创建pyrex扩展类型

时间:2012-11-19 17:17:06

标签: python pyrex

我有一个像这样的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扩展类型的一般技术是什么?

1 个答案:

答案 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