2013-06-10 2 views
10

나는 파이썬을 C++에 임베드했다. 그리고 나는 함수를 실행 한 결과 인 boost :: python :: object의 타입을 찾는 방법이 있는지 알고 싶다. 파이썬 모듈. 위의 코드에서부스트 파이썬 객체의 유형을 찾는다

boost::python::object module_ = boost::python::import("..libName"); 
boost::python::object result_ = module_.attr("..functionName")(arg1, arg2,...); 
//suppose if the result is int, 
int a_ = boost::python::extract<int>(result_); 

, 내가 그것을 추출하기 전에 결과의 유형 을 찾을 수있는 방법이 있는지 알고 싶은 것이 :이처럼 내 코드가 있습니다. 위의 코드에서 result_는 list, tuple과 같은 유형일 수 있습니다.

답변

3

객체 유형을 가져 오는 데는 몇 가지 방법이 있습니다. 어떤 형식을 사용 하느냐에 따라 결과는 달라집니다. result_.attr("__class__")을 사용하면 클래스를 boost :: python :: object로 사용할 수 있습니다. PyObject_IsInstance function을 사용하여 생각하는 유형인지 확인할 수도 있습니다. 마지막으로 PyObject_Type function을 사용하여 PyObject *로 유형을 가져올 수 있습니다.

7

당신은 나를 위해 작동이

std::vector<std::string> list_to_vector(boost::python::list& l) 
{ 
    for (int i = 0; i < len(n); ++i) 
    { 
     boost::python::extract<boost::python::object> objectExtractor(l[i]); 
     boost::python::object o=objectExtractor(); 
     std::string object_classname = boost::python::extract<std::string>(o.attr("__class__").attr("__name__")); 
     std::cout<<"this is an Object: "<<object_classname<<std::endl; 
    } 
    ................................................... 
    ................................................... 
} 

을 시도 할 수 있습니다. 당신이 정수인지 확인하고자하는 것 때문에

2

, 당신은 extract<T> x(o) 사용할 수 있습니다

boost::python::extract<int> n(o); 

if (n.check()) 
    // it's an integer, or at least convertible to one 
else 
    // not an integer 

documentation는 말한다 :

추출 X (O) 의 check() 멤버 함수를 사용하여 에 예외가 발생시키지 않고 변환이 가능한지 여부를 묻는 데 사용할 수있는 추출기를 생성합니다.

부동이을 정수로 변환 간주 될 수있는 것처럼이 들릴지도 모르지만 나는 그것을 시도, 그것은하지 않습니다. 즉, 매번 옳은 일을한다고 나는 정말로 믿지 않을 것입니다! 내장 유형의

,이 경우 정수에, 나는 PyInt_Check를 사용하는 것이 더 안전하다고 생각하지만여기에 몇 가지 코드를 테스트 할 때 적어도 즉시 사용할 수 없습니다.

즉, 파이썬 내장형이 아닌 객체 유형을 결정해야한다면 @Aereaux's suggestion을 사용하여 PyObject_IsInstance을 따라갈 것입니다. (하지만 개인적으로 혼합보다는 오히려 Boost Python 코드 기반을 갖는 것이 더 좋을 것입니다.)

+0

신뢰할 수 없다고 제안했듯이. 은 행복하게 정수를 허용합니다 – Sergei

+1

예. 이 게시물 이후로, 나는'extract'가 호환 가능한 타입간에 자동적으로 변환을 시도 할 것이라는 것을 깨달았습니다. 정확하게 정수인지 확인하는 방법은'PyInt_Check'를 사용하는 것입니다. – csl

관련 문제