web-dev-qa-db-ja.com

cythonの問題:「bool」はタイプ識別子ではありません

std::vector<bool>クラスメンバをPythonクラスに公開しようと必死です。

これが私のC++クラスです。

class Test
{
  public:
    std::vector<bool> test_fail;
    std::vector<double> test_ok;
};

タイプdouble(またはint、float、..)のtest_okのアクセスと変換は機能しますが、bool!では機能しません!

Cythonクラスは次のとおりです。

cdef class pyTest:
     cdef Test* thisptr
     cdef public vector[bool] test_fail
     cdef public vector[double] test_ok

     cdef __cinit__(self):
         self.thisptr = new Test()
         self.test_fail = self.thisptr.test_fail # compiles and works if commented
         self.test_ok = self.thisptr.test_ok

     cdef __dealloc__(self):
         del self.thisptr

私が得るエラーは次のとおりです:

Error compiling Cython file:
------------------------------------------------------------
...




cdef extern from *:
    ctypedef bool X 'bool'
            ^
------------------------------------------------------------

vector.from_py:37:13: 'bool' is not a type identifier

私はpython 2.7.6およびCython 0.20.2(0.20.1も試しました)を使用しています。

私もプロパティを試してみましたが、うまくいきません。

補遺: pyxファイルの上部にfrom libcpp cimport boolがあり、ベクターのインポートもあります。

どうしましたか ??これはバグかもしれません。誰もこれを回避する方法を知っていますか?ありがとう。

31
carmellose

有効な回避策を見つけましたが、最適ではないかもしれません。

pytestクラスのメンバータイプをpythonリストで置き換えました。

ドキュメントに記載されているように、変換は暗黙的に行われます。 http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#standard-library

すべての変換で新しいコンテナが作成され、そこにデータがコピーされます。コンテナ内のアイテムは、対応するタイプに自動的に変換されます。これには、コンテナ内のコンテナの再帰的な変換が含まれます。文字列のマップのC++ベクトル。

だから今、私のクラスは次のようになります:

cdef class pyTest:
     cdef Test* thisptr
     cdef public list test_fail #now ok
     cdef public list test_ok

     cdef __cinit__(self):
         self.thisptr = new Test()
         self.test_fail = self.thisptr.test_fail # implicit copy & conversion
         self.test_ok = self.thisptr.test_ok # implicit copy and conversion

     cdef __dealloc__(self):
         del self.thisptr
2
carmellose

必要な追加のC++サポートがいくつかあります。 .pyxファイルの上部に、追加します

from libcpp cimport bool

Std :: stringやSTLコンテナーなど、必要な他のものを見つけるために、その中を見ていきます

44
Ben

Cythonでbooleanオブジェクトを定義するには、bintとして定義する必要があります。 here :によると、 "boolean int"オブジェクトのbintはc intにコンパイルされますが、ブール値としてCythonとの間で強制変換されます。

20
Dalek