Это кросс-пост вопроса, который я задал в группе пользователей Cython полтора дня назад, но еще не получил ни одного ответа, поэтому я пытаюсь попытать счастья на более общем форуме
Я пытался всеми способами обернуть этот следующий код, с различными степенями ошибок. Множество поисков заставили меня наткнуться на подобные вопросы, а также на выдающийся билет в список желаний, но, честно говоря, я не уверен, что я даже на правильном пути.
plow_types.h:
namespace Plow {
struct JobState {
enum type {
INITIALIZE = 0,
RUNNING = 1,
FINISHED = 2
};
};
...
class JobFilterT {
public:
...
std::vector<JobState::type> states;
...
Поэтому я пытаюсь обернуть это Plow::JobState::type
ENUM. Самый близкий, который я получил, после нахождения другого подобного поста, заканчивал этой попыткой:
plow_types.pxd:
cdef extern from "rpc/plow_types.h" namespace "Plow":
enum JobState_type "Plow::JobState::type":
INITIALIZE "Plow::JobState::INITIALIZE"RUNNING "Plow::JobState::RUNNING"FINISHED "Plow::JobState::FINISHED"
struct JobState:
JobState_type type
...
cdef cppclass JobFilterT:
vector[JobState_type] states
И я получаю ошибку:
src/plow.cpp: In function ‘std::vector<Plow::JobState::type, std::allocator<Plow::JobState::type> > __pyx_convert_vector_from_py_enum__Plow_3a__3a_JobState_3a__3a_type(PyObject*)’:
src/plow.cpp:6688: error: invalid conversion from ‘long int’ to ‘Plow::JobState::type’
Я попытался просто определить свои собственные версии констант в моем Python Python и рассматривать все как INT (vector[int] states
) но компилятор жалуется на то, что не знает, как делать преобразования из int long
в Plow::JobState::type
,
Я наконец понял это, попробовав невероятное количество комбинаций. Это не было далеко от моей последней попытки, прежде чем задавать вопрос …
plow_types.pxd:
Мне нужно было просто забыть об этом JobState
структура, и только обернуть перечисление. Но мне также нужно было сопоставить их с новыми именами в Cython, чтобы избежать коллизий имен с другими перечислениями, использующими подобную технику пространства имен.
cdef extern from "rpc/plow_types.h" namespace "Plow":
ctypedef enum JobState_type "Plow::JobState::type":
JOBSTATE_INITIALIZE "Plow::JobState::INITIALIZE"JOBSTATE_RUNNING "Plow::JobState::RUNNING"JOBSTATE_FINISHED "Plow::JobState::FINISHED"
Теперь я могу сослаться на JobState_type
в таких вещах, как vector[JobState_type]
, Затем я использовал этот подход, чтобы сделать мои константы доступными в python, только для чтения:
job.pyx:
cimport cython
@cython.internal
cdef class _JobState:
cdef:
readonly int INITIALIZE
readonly int RUNNING
readonly int FINISHED
def __cinit__(self):
self.INITIALIZE = JOBSTATE_INITIALIZE
self.RUNNING = JOBSTATE_RUNNING
self.FINISHED = JOBSTATE_FINISHED
JobState = _JobState()
Это дает мне публичный случай JobState
, с постоянными атрибутами только для чтения.
И когда нужно преобразовать обратно из списка значений Python в vector[JobState_type]
Я бы сделал это:
someList = [JobState.RUNNING]
...
cdef:
JobState_type i
vector[JobState_type] vec_states
for i in someList:
vec_states.push_back(i)
Других решений пока нет …