Проблема 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, а также импорт вектора.
Что случилось? Я считаю, что это может быть ошибкой. Кто-нибудь знает, как обойти это? Спасибо.
Ответы
Ответ 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.