如何通过python-C api将切片对象的元组传递给C

问题描述 投票:1回答:2

我在python中使用的c中有一个二维矩阵类。我希望能够通过传递切片对象的元组来调用矩阵类,例如A [1:2,1:2]。到目前为止,我有以下内容。 __getitem__方法的相关C代码看起来像

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

此代码使用PySlice_Check方法检查slice2是否确实是切片对象。如果我注释掉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.中,即使PySliceObjectPyObject,此函数也接受PySlice_Check(slice1),而不是PySlice_Check(slice2),这就是slice1和slice2的含义。都返回1。

我在python中使用的c中有一个二维矩阵类。我希望能够通过传递切片对象的元组来调用矩阵类,例如A [1:2,1:2]。到目前为止,我有以下内容。 ...

python c python-c-api
2个回答
2
投票

由于A. Taggart,这是解决方案。:


0
投票

__getitem__接受一个参数,在您的情况下是两个切片对象的元组。这意味着在C中,slices指向包含两个切片对象的单个元组。

© www.soinside.com 2019 - 2024. All rights reserved.