2011-07-29 10 views
2

文字列フィールドを持つ拡張タイプ(cdef class)があります。私はそれを宣言する最良の方法が何か分かりません。Cython拡張タイプのPython文字列

cdef class Box: 
    cdef char *_s 
    cdef public str s1 
    cdef public bytes s2 

    property s: 
     def __get__(self): 
      cdef bytes py_string = self._s 
      return py_string 

    def __init__(self, s): 
     cdef char *aux = s 
     self._s = aux 
     self.s1 = s 
     self.s2 = s 

と拡張タイプを使用して次のコードを想定し

>>> import test as t 
>>> b = t.Box("hello") 
>>> b.s 
'hello!' 
>>> b.s1 
'hello' 
>>> b.s2 
'hello' 
>>> type(b.s) 
<type 'str'> 
>>> type(b.s1) 
<type 'str'> 
>>> type(b.s2) 
<type 'str'> 

彼らはすべての作業が、私は、ガベージコレクションとStringオブジェクトの寿命のような問題についてはよく分かりません。私はchar * +プロパティのアプローチが3つの中で最も効率が悪いので好きではありません。

私の質問です:これを行う最善の方法は何ですか? cdef public str sは安全ですか?

EDIT:

まあcdef public str sは限りBoxへの参照がどこかに保持されているとして正常に動作するようです。

>>> gc.collect() 
0 
>>> gc.is_tracked(b) 
True 
>>> gc.get_referrers(b.s1) 
[<test.Box object at 0x1a4f680>] 
>>> gc.get_referrers(b.s2) 
[<test.Box object at 0x1a4f680>] 
>>> b.s1 
'hello' 

ありがとうございます。

+1

私は、生成されたc/C++コードを調べることが非常に役立つことがよくあります。だから、シーンの裏に何が起こっているのかが分かる。 – rocksportrocker

+0

ありがとう、私はそれを助けた:それは助けた:) – Alex

答えて

0

文字列のガベージコレクションに関する懸念がある理由はわかりません。

その文字列が別のC空間プログラムから来た場合は、その値をコピーして、Boxオブジェクトがそれを所有するようにします。

+0

文字列はPythonのスペースから来て、Cのスペースに格納する必要があります。 – Alex

関連する問題