Как получить срез python для работы с моим классом массивов c ++ с помощью SWIG

У меня есть класс массива Array1D, определенный в c ++, который по существу обертывает векторный класс STL. Я расширил этот класс, чтобы я мог отображать отдельные элементы вектора массива. Вот соответствующий код в моем файле интерфейса SWIG:

namespace std{ %template(dblVector) vector<double>; } %extend Array1D{ double __getitem__(int index) { return (*self)[index]; } } 

Это позволяет мне получить доступ к отдельным элементам массива в python:

 >>> a = Array1D(10) # creates a c++ vector of length 10 with zeros >>> a[0] >>> 0 

Я хочу, например, иметь возможность называть a[1:3] , однако, когда я пытаюсь это сделать, я получаю TypeError:

 TypeError: in method 'Array1D___getitem__', argument 2 of type 'int' 

One Solution collect form web for “Как получить срез python для работы с моим классом массивов c ++ с помощью SWIG”

Проблема в том, что python передает объект Slice при вызове варианта среза getitem, и ваше определение функции ожидает int. Вам нужно будет написать версию getitem, которая берет PyObject * в качестве параметра, а затем вам придется реализовать нарезку вектора там.

Я пишу это, не настроившись, чтобы проверить его, поэтому возьмите его с солью. Но я бы сделал что-то вроде следующего.

 %extend Array1D { Array1D* __getitem__(PyObject *param) { if (PySlice_Check(param)) { /* Py_ssize_t might be needed here instead of ints */ int len = 0, start = 0, stop = 0, step = 0, slicelength = 0; len = this->size(); /* Or however you get the size of a vector */ PySlice_GetIndicesEx((PySliceObject*)param, len, &start, &stop, &step, &slicelength); /* Here do stuff in order to return an Array1D that is the proper slice given the start/stop/step defined above */ } /* Unexpected parameter, probably should throw an exception here */ } } 
  • использование swig для привязки буферов протокола Google
  • Быстрое преобразование вектора C / C ++ в массив Numpy
  • Python: SWIG vs ctypes
  • Python / SWIG: вывод массива
  • M2Crypto не устанавливается в venv, или swig не определяет __x86_64__, который разбивается на OpenSSL
  • Swig python - c ++ как использовать тип int8_t
  • Swig, возвращая массив парных
  • SWIG Python привязки к собственному коду, не работающему с OpenCV 2.1
  • Расширение python - для swig, а не для swig или Cython
  • Как глобальные переменные C / C ++ реализованы в python?
  • SWIG передает аргумент функции обратного вызова python
  • Python - лучший язык программирования в мире.