11

これは、 1日半前にcython-userグループで尋ねた質問のクロスポストですが、まだ返信がないので、より一般的なフォーラムで運試しをしています。

私はさまざまな程度のエラーで、この次のコードをラップするためにあらゆる方法を試みてきました。たくさんの検索で、私は同様の質問と優れたウィッシュリストチケットに出くわしましたが、正直なところ、私が正しい道を進んでいるかどうかはわかりません。

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列挙型をラップしようとしています。別の同様の投稿を見つけた後、私が得た最も近いものは、この試みで終わっていました:

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. これを正確にラップするためにこれも必要ですか、それとも他の方法でこれらの「名前空間」定数にアクセスするという私の目標を達成できますか?これらの構造体を完全に無視し、int値と一致する独自のバージョンの定数をpyxで定義する必要がありますか?

cython pyxで定数の独自のバージョンを定義し、すべてをint( )として処理しようとしましたが、コンパイラーはからへvector[int] statesの変換方法がわからないと文句を言います。int longPlow::JobState::type

4

1 に答える 1

8

信じられないほどの数の組み合わせを試した後、私は最終的にそれを理解しました. 質問をする前の私の最後の試みからそう遠くはありませんでした...

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 で読み取り専用の方法で使用できるようにしました。

ジョブ.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)
于 2013-03-22T09:12:48.393 に答える