【问题标题】:How to pass a tuple of slice objects to C via the python-C api如何通过 python-C api 将切片对象的元组传递给 C
【发布时间】:2014-04-22 08:30:34
【问题描述】:

我在 python 中使用了一个 c 中的 2d 矩阵类。我希望能够通过传递切片对象的元组来调用矩阵类,例如 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. 此函数接受PySliceObject 而不是PyObject,即slice1 和slice2,即使PySlice_Check(slice1) 和@987654333 @ 都返回 1。

【问题讨论】:

    标签: python c python-c-api


    【解决方案1】:

    感谢A. Taggart,这是解决方案:

    int __getitem__(PyObject *slices){
        PyObject* slice1;
        PyObject* slice2;    
        slice1 = PyTuple_GetItem(slices, 0);
        slice2 = PyTuple_GetItem(slices, 1);
    
        Py_ssize_t len = 0, start1 = 0, stop1 = 0, step1 = 0, slicelength1 = 0;
        Py_ssize_t start2 = 0, stop2 = 0, step2 = 0, slicelength2 = 0;
        len = (*self).size() // or however you get the length of the slice
        PySlice_GetIndicesEx((PySliceObject*)slice1,len,&start1,&stop1,&step1,&slicelength1);
        PySlice_GetIndicesEx((PySliceObject*)slice2,len,&start2,&stop2,&step2,&slicelength2);
    
    return 0;
    

    这里的关键是传递(PySliceObject*)slice1,它将切片对象作为PySliceObject 传递。

    【讨论】:

      【解决方案2】:

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

         PyObject* indices;
         PyObject* slice1;
         PyObject* slice2;
         indices = PyTuple_GetItem(slices, 0); // get tuple
         slice1 = PyTuple_GetItem(indices, 0); // get first slice from tuple
         slice2 = PyTuple_GetItem(indices, 1); // get second slice from tuple
      

      【讨论】:

      • 感谢您的帮助。但是,当我尝试使用 PySlice_GetIndicesEx(slice1,length,&start,&stop,&step) 时,我得到了同样的错误:error: cannot convert 'PyObject* {aka _object*}' to 'PySliceObject*' for argument '1' to 'int PySlice_GetIndices。还有其他方法可以获取 slice1 对象的起始值和终止值吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 2018-11-09
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多