2011-11-21 3 views
1

std::vector 인스턴스를 확장하는 C++ 클래스에 대한 Python 바인딩을 개발 중입니다. 이 클래스에 대한 작업 파이썬 첨자 연산자 나는 다음과 같이 __getitem__ 기능을 찾고 추가 얻으려면 (I는 관련이없는 코드와 오류 처리 컷) 다음은 위의 하나의 요소에 액세스하기위한 파이썬의 모든 권리 작동SWIT에서 사용할 C++ __getitem__ 함수에서 슬라이스를 처리하는 방법

class Column; 

typedef vector<Column*> MetaDataBase; 

class MetaData : public MetaDataBase { 
public: 

#ifdef SWIGPYTHON 
Column* __getitem__(int i) { return (*this)[i]; } 
#endif 
}; 

을하지만, 그렇지 않습니다 조각을 위해 일하십시오.

좋아요, 그렇기 때문에 함수의 매개 변수 유형을 PyObject *으로 변경하고 PySlice_Check을 사용하여 함수가 PyList을 반환해야하는지 확인해야합니다.

괜찮습니다. 문제 없습니다. 하지만 때때로 함수에서 PyList을 반환해야하기 때문에 __getitem__ 반환 값의 형식은 PyObject*이어야하며 SWIG를 사용하여 C++ 유형 (Column *)을 래퍼 클래스로 변환 할 수 없습니다. 또한 슬라이스를 만들 때 Column*PyObject*으로 '수동으로 변환'한 다음 PyList에 삽입해야합니다.

어떻게하면됩니까?

답변

3

SWIG + Python을 사용하여 std::vector에 대한 훨씬 간단한 해결책이 있다고 생각합니다. SWIG의 파이썬 코드 생성은 이미 일부 STL 컨테이너를 래핑하는 작업을 지원합니다.

당신이 당신의 모듈 인터페이스의 시작 부분에 추가하는 경우 : 당신이하지 않은 경우 어딘가에

%include "pyabc.i" 
%include "std_vector.i" // Assuming you don't already 

과 :

%template(MetaDataBase) std::vector<Column*>; 

는 다음이 랩 std::vector가 충족하게됩니다 Python의 MutableSequence 요구 사항 (나는 이것이 파이썬 측에서 찾고자하는 것을 달성하기에 충분해야한다고 생각한다. SWIG를 -extranative으로 호출해야 할 수도있다). "오염"당신의 "정상적인"헤더없이이 작업을 수행 할 수 있습니다

%extend MetaData { 
    Column* __getitem__(int i) { return (*self)[i]; } 
}; 

: 현재 __getitem__ 당신이 선언과 같은 것을 사용하여 꿀꺽 꿀꺽 인터페이스 파일에서 정의 할 수 있습니다 - 또한

가능성 주목할 필요 SWIG + Python 특정 코드가있는 파일.

+0

% 템플릿 (MetaDataBase) std :: vector ; 트릭을 수행했습니다! 나는 방금 내 자신의'__getitem__'을 지우고 모든 것이 매력처럼 작동합니다. - 정말 고마워요! – piokuc

관련 문제