2017-12-19 17 views
1

PyBind11のドキュメントでは、enumhereの使用について説明しています。示さPyBind11グローバルレベルの列挙型

の例では、列挙型がそうのように、クラスの中に埋め込まれていることを前提としています

struct Pet { 
    enum Kind { 
     Dog = 0, 
     Cat 
    }; 

    Pet(const std::string &name, Kind type) : name(name), type(type) { } 

    std::string name; 
    Kind type; 
}; 

py::class_<Pet> pet(m, "Pet"); 

pet.def(py::init<const std::string &, Pet::Kind>()) 
    .def_readwrite("name", &Pet::name) 
    .def_readwrite("type", &Pet::type); 

py::enum_<Pet::Kind>(pet, "Kind") 
    .value("Dog", Pet::Kind::Dog) 
    .value("Cat", Pet::Kind::Cat) 
    .export_values(); 

私の状況は異なっています。私はグローバルなenumを持っており、その値はいくつかの関数の動作を変更するために使われます。

enum ModeType { 
    COMPLETE, 
    PARTIAL, 
    SPECIAL 
}; 

std::vector<int> Munger(
    std::vector<int> &data, 
    ModeType   mode 
){ 
    //... 
} 

私はそうのようにそれを登録しようとしています:

PYBIND11_MODULE(_mlib, m) { 
    py::enum_<ModeType>(m, "ModeType") 
    .value("COMPLETE", ModeType::COMPLETE) 
    .value("PARTIAL", ModeType::PARTIAL ) 
    .value("SPECIAL", ModeType::SPECIAL ) 
    .export_values(); 

    m.def("Munger",    &Munger, "TODO"); 
} 

コンパイルは成功し、Pythonでモジュールのロードが、私は、モジュールの名前でModeTypeが表示されません。

どうすればよいですか?

+0

あなたは)(export_valuesを呼び出さずに試したことがありますか?私のために働く – ZivS

+0

同じ問題がここにあります。私はこの状況では、 "unscoped列挙型"はより良いフィット感だと思う:https://github.com/pybind/pybind11/blob/master/tests/test_enum.cppしかし、私はまだ "互換性のない関数の引数"型エラーを取得します。 – mark

答えて

0

以下のサンプルは私のために働いています。私のコメントのように、私は "unscoped enum"(github.com/pybind/pybind11/blob/master/tests/test_enum.cpp)を使用しました。私はこの

import pybind11_example as ep 
ep.mood(ep.Happy) 

のようなコードを使用することができます

#include <pybind11/pybind11.h> 

enum Sentiment { 
    Angry = 0, 
    Happy, 
    Confused 
}; 

void mood(Sentiment s) { 
}; 

namespace py = pybind11; 

PYBIND11_MODULE(pybind11_example, m) { 
    m.doc() = "pybind11 example"; 

    py::enum_<Sentiment>(m, "Sentiment") 
     .value("Angry", Angry) 
     .value("Happy", Happy) 
     .value("Confused", Confused) 
     .export_values(); 

    m.def("mood", &mood, "Demonstrate using an enum"); 
}