python — упаковочная структура с вложенным enum — ссылкой в ​​векторном шаблоне

Это кросс-пост вопроса, который я задал в группе пользователей 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’

Либо / или:

  1. Как я могу правильно обернуть это вложенное перечисление?
  2. Нужно ли вообще пытаться обернуть это точно, или я могу достичь своей цели доступа к этим «пространствам имен» другими способами? Должен ли я просто полностью игнорировать эти структуры и определять свои собственные версии констант в моем pyx с соответствующими значениями int?

Я попытался просто определить свои собственные версии констант в моем Python Python и рассматривать все как INT (vector[int] states) но компилятор жалуется на то, что не знает, как делать преобразования из int long в Plow::JobState::type,

11

Решение

Я наконец понял это, попробовав невероятное количество комбинаций. Это не было далеко от моей последней попытки, прежде чем задавать вопрос …

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)
7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]