Подтвердить что ты не робот

Проблема cython: 'bool' не является идентификатором типа

Я отчаянно пытаюсь открыть класс класса std::vector<bool> для класса Python.

Вот мой класс С++:

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

Пока работает доступ и преобразование test_ok типа double (или int, float,..), это не для 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).

Я также пробовал со свойствами, но он тоже не работает.

Добавление: У меня есть from libcpp cimport bool в верхней части моего файла pyx, а также импорт вектора.

Что случилось? Я считаю, что это может быть ошибкой. Кто-нибудь знает, как обойти это? Спасибо.

4b9b3361

Ответ 1

Я нашел допустимое обходное решение, хотя оно может и не быть оптимальным.

Я заменил типы членов класса pytest на списки python.

Теперь преобразование выполняется неявно, как описано в документации: http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#standard-library

Все преобразования создают новый контейнер и копируют в него данные. Элементы в контейнерах автоматически преобразуются в соответствующий тип, который включает в себя рекурсивно конвертирующие контейнеры внутри контейнеров, например. вектор С++ карт строк.

Итак, теперь мой класс выглядит следующим образом:

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

Там вам потребуется дополнительная поддержка С++. В верхней части вашего .pyx файла добавьте

from libcpp cimport bool

Я бы заглянул внутрь, чтобы найти другие вещи, которые вам могут понадобиться, например std::string и STL контейнеры

Ответ 3

Чтобы определить boolean объекты в cython, их нужно определить как bint. В соответствии с здесь: BINT объекта "boolean int" скомпилирован в ac int, но получает принудительное выполнение и от Cython как booleans.