Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在我的C++__getitem__;函数(由SWIG使用) 我正在为一个C++类开发Python绑定,它扩展了 STD::vector < /Calp>实例化。为了让Python下标操作符为这个类工作,我添加了\uuu getitem\uu函数,如下所示(我剪切了不相关的代码和错误处理): 类列; 向量元数据库; 类元数据:公共元数据库{ 公众: #ifdef SWIGPYTHON 列*uuu getitem_uuuu(int i){return(*this)[i];} #恩迪夫 };_C++_Python_Swig - Fatal编程技术网

如何在我的C++__getitem__;函数(由SWIG使用) 我正在为一个C++类开发Python绑定,它扩展了 STD::vector < /Calp>实例化。为了让Python下标操作符为这个类工作,我添加了\uuu getitem\uu函数,如下所示(我剪切了不相关的代码和错误处理): 类列; 向量元数据库; 类元数据:公共元数据库{ 公众: #ifdef SWIGPYTHON 列*uuu getitem_uuuu(int i){return(*this)[i];} #恩迪夫 };

如何在我的C++__getitem__;函数(由SWIG使用) 我正在为一个C++类开发Python绑定,它扩展了 STD::vector < /Calp>实例化。为了让Python下标操作符为这个类工作,我添加了\uuu getitem\uu函数,如下所示(我剪切了不相关的代码和错误处理): 类列; 向量元数据库; 类元数据:公共元数据库{ 公众: #ifdef SWIGPYTHON 列*uuu getitem_uuuu(int i){return(*this)[i];} #恩迪夫 };,c++,python,swig,C++,Python,Swig,上述方法在Python中可以访问单个元素,但不适用于切片 好的,我知道我需要将函数参数的类型更改为PyObject*,并使用PySlice\u Check查看函数是否应该返回PyList 这很好,没问题。但是,因为我必须从函数返回代码> > PyList,因此, > ygGeTimeTyx返回值必须是 PyObjult*/Cuth>,而且我不能依靠SWIG将C++类型(列*> /Cuff>)转换为包装类。另外,在创建切片时,我需要将Column*手动转换为PyObject*,然后再将其插入PyL

上述方法在Python中可以访问单个元素,但不适用于切片

好的,我知道我需要将函数参数的类型更改为
PyObject*
,并使用
PySlice\u Check
查看函数是否应该返回
PyList

这很好,没问题。但是,因为我必须从函数返回代码> > PyList</代码>,因此,<代码> > ygGeTimeTyx返回值必须是<代码> PyObjult*/Cuth>,而且我不能依靠SWIG将C++类型(列*> /Cuff>)转换为包装类。另外,在创建切片时,我需要将
Column*
手动转换为
PyObject*
,然后再将其插入PyList


我该怎么做呢?

我认为对于使用SWIG+Python的
std::vector
,有一个更简单的解决方案。SWIG的Python代码生成已经支持包装一些STL容器

如果在模块接口的开头添加:

%include "pyabc.i"
%include "std_vector.i" // Assuming you don't already
在某个地方,如果你没有这样做:

%template(MetaDataBase) std::vector<Column*>;
它允许您在不使用SWIG+Python特定代码“污染”您的“正常”头文件的情况下执行此操作

%模板(元数据库)std::vector成功了!我刚刚删除了我自己的
\uuuu getitem\uuuu
,一切都像一个符咒-非常感谢!
%template(MetaDataBase) std::vector<Column*>;
%extend MetaData {
   Column* __getitem__(int i) { return (*self)[i]; }
};