如何使用SWIG使用python切片来处理我的c ++数组类

时间:2014-04-21 22:03:40

标签: python c++ arrays 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'

1 个答案:

答案 0 :(得分:1)

问题是python在调用 getitem 的切片变体时传递了Slice对象,并且你的函数定义期望一个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 */
    }
}