2014-07-09 12 views
21

Sto cercando disperatamente di esporre un membro della classe std::vector<bool> a una classe Python.problema cython: 'bool' non è un identificatore di tipo

Qui è la mia classe C++:

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

Mentre l'accesso e la conversione di test_ok di tipo double (o int, float, ..) funziona, non lo fa per bool!

Ecco la mia classe 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 

L'errore che ottengo è:

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




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

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

sto usando Python 2.7.6 e 0.20.2 Cython (anche provato 0.20.1) .

Ho provato anche con le proprietà ma non funziona neanche.

Addendum: Ho il from libcpp cimport bool nella parte superiore del mio file pyx, così come l'importazione del vettore.

Cosa c'è che non va ?? Credo che questo potrebbe essere un bug. Qualcuno sa come aggirare questo? Grazie.

+0

Il wiki Cython è molto utile per quanto riguarda questo problema: https://github.com/cython/cython/wiki/FAQ#id49 –

risposta

1

Ho trovato una soluzione valida, anche se potrebbe non essere ottimale.

Ho sostituito i tipi di membri della classe pytest con gli elenchi Python.

La conversione viene ormai fatta implicitamente, come descritte nella documentazione: http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#standard-library

Tutte le conversioni di creare un nuovo contenitore e copiare i dati in esso. Gli articoli nei contenitori vengono convertiti automaticamente in un tipo corrispondente, che include la conversione ricorsiva di contenitori all'interno dei contenitori, ad es. un vettore C++ di mappe di stringhe.

Così ora, la mia classe assomiglia a questo:

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 
22

C'è un supporto in C++ in più che devi fare. Nella parte superiore del file .pyx, aggiungere

from libcpp cimport bool 

mi piacerebbe dare un'occhiata all'interno che per trovare le altre cose si potrebbe aver bisogno, come std :: string e STL contenitori

+1

Can sembra modificare la mia risposta: aggiungi 'da libcpp.vector cimport vector' per la parola chiave vettoriale – Ben

+0

ciao, ho dimenticato di dire che ho il' cimport bool' nella parte superiore del mio file pyx :( – carmellose

+0

Penso di Lettura errata Sembra che si stia lamentando del typedef "bool", che non è necessario.Se hai importato bool, puoi dichiarare qualsiasi variabile bool con 'cdef bool x' – Ben

6

al fine di definire boolean oggetti in cython, devono essere definiti come bint. Secondo here: il bint dell'oggetto "boolean int" viene compilato in un c int, ma viene convertito in e da Cython come booleano.

Problemi correlati