2

次のような 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)

次のように、既存の C 値を使用して、他の場所の Pyrex コード内からこの拡張タイプのインスタンスを作成できるようにしたいと考えています。

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 拡張型を作成する一般的な手法は何ですか?

4

1 に答える 1

2

私はこれを理解しました。私の問題は、私がこれをしていたことでした:

rv = {}
rv['val'] = ExtensionType()
rv['val'].c_attr = val

rv['val'] は現在 Python オブジェクトであるため、これは機能しません。そのため、cdef 属性にアクセスできません。このように、中間cdefを使用する必要があります

cdef ExtensionType tmpvar
rv = {}
tmpvar = ExtensionType()
tmpvar.c_attr = val
rv['val'] = tmpvar
于 2012-11-21T13:34:39.183 に答える