У меня есть класс 2d-матрицы в c, который я использую в python. Я хочу иметь возможность вызывать матричный класс, передавая кортеж объектов среза, например, A[1:2,1:2]. Пока что имею следующее. Соответствующий код C для метода __getitem__
выглядит так:
int __getitem__(PyObject *slices){ // get tuple of slice objects
PyObject* slice1; // declare first slice object
PyObject* slice2; // declare second slice object
slice1 = PyTuple_GetItem(slices, 0); // get first slice from tuple
slice2 = PyTuple_GetItem(slices, 1); // get second slice from tuple
// get start and stop of first slice (currently the following three lines do not work)
Py_ssize_t start, stop, step, length;
PySlice_GetIndicesEx(slice1,length,&start,&stop,&step);
return PySlice_Check(slice2) ;
}
Этот код проверяет, действительно ли slice2 является объектом слайса, используя метод PySlice_Check
. Если я закомментирую PySlice_GetIndicesEx(slice1,length,&start,&stop,&step)
, я получу 1
, как и ожидалось. Однако, если я оставлю эту строку, я получаю сообщение об ошибке:
cannot convert 'PyObject* {aka _object*}' to 'PySliceObject*' for argument '1' to 'int PySlice_GetIndicesEx(...
что означает, что я не могу передать slice1 или slice2 в PySlice_GetIndicesEx
, так как ему нужен объект PySliceObject
.
Как мне правильно распутать объекты среза, чтобы я мог передать их в PySlice_GetIndicesEx.
Эта функция принимает PySliceObject
, а не PyObject
, что и есть slice1 и slice2, даже если PySlice_Check(slice1)
и PySlice_Check(slice2)
возвращают 1.