2017-12-19 30 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 있습니다.

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"); 
} 

컴파일이 성공하고, 파이썬에서 모듈로드,하지만 난 모듈의 이름에 ModeType이 표시되지 않는 :

enum ModeType { 
    COMPLETE, 
    PARTIAL, 
    SPECIAL 
}; 

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

그래서처럼 등록을 시도했다.

어떻게해야합니까?

+0

당신이 봤어 export_values를 호출하지 않고()? 나를 위해 일 – ZivS

+0

같은 문제는 여기에. 이 상황에서 "unscoped enum"이 더 적합하다고 생각합니다. https://github.com/pybind/pybind11/blob/master/tests/test_enum.cpp하지만 여전히 "호환되지 않는 함수 인수"유형 오류가 발생합니다. – mark

답변

0

아래 샘플은 저에게 적합합니다. 내 의견 에서처럼 "범위가없는 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"); 
}