如何在我的c++ __getitem__函数中处理切片(由SWIG使用)
How to handle slices in my C++ __getitem__ function (to be used by SWIG)
我正在为扩展std::vector
实例化的c++类开发Python绑定。为了让Python下标操作符为这个类工作,我添加了__getitem__
函数,如下所示(我删除了不相关的代码和错误处理):
class Column;
typedef vector<Column*> MetaDataBase;
class MetaData : public MetaDataBase {
public:
#ifdef SWIGPYTHON
Column* __getitem__(int i) { return (*this)[i]; }
#endif
};
上面的代码在Python中可以很好地访问单个元素,但不能用于切片。
好的,所以我明白我需要将函数的参数类型更改为PyObject *
,并使用PySlice_Check
来查看该函数是否应该返回PyList
。
这很好,没有问题。但是因为我有时必须从函数返回PyList
,所以__getitem__
返回值的类型也必须是PyObject*
,并且我不能依赖SWIG将我的c++类型(Column *
)转换为包装器类。此外,在创建切片时,我需要在将其插入PyList之前"手动"将Column*
转换为PyObject*
。
我该怎么做?
我认为对于std::vector
使用SWIG+Python有一个更简单的解决方案。SWIG的Python代码生成已经支持很好地包装一些STL容器。
如果您在模块接口的开头添加:
%include "pyabc.i"
%include "std_vector.i" // Assuming you don't already
和其他地方,如果你没有这样做:
%template(MetaDataBase) std::vector<Column*>;
,这将导致包装的std::vector
满足Python的mutablessequence的要求。(我认为这应该足以实现您在Python方面所寻找的,您可能还需要使用-extranative
调用SWIG)。
同样值得注意的是-对于当前的__getitem__
,您可以在SWIG接口文件中声明和定义它,使用如下内容:
%extend MetaData {
Column* __getitem__(int i) { return (*self)[i]; }
};
允许你这样做,而不会用SWIG+Python特定的代码"污染"你的"正常"头文件。
相关文章:
- Python 3.7 和 excess_args 的 SWIG 问题
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 为重写std::exception的库生成swig接口时出错
- 如何优雅地切片对象
- 避免矢量中的对象切片<Base><shared_ptr>
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- 从 std::vector<无符号字符>切片中提取 int?
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- 在模板化函数中重新定义(忽略)的 SWIG 标识符
- 使用 swig 追加到字节数组
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 专门化模板覆盖函数/避免对象切片
- 我如何告诉叮叮当当的整洁切片特定类是可以的?
- Java SWIG wrapper vs direct function calling
- FFMPEG:sws_scale返回错误:切片参数 0, 2160 无效
- <string> 如何在使用 SWIG 时将 int 数组和 List 作为参数传递给 C# C++
- 如何在我的c++ __getitem__函数中处理切片(由SWIG使用)
- 如何使用SWIG让python切片与我的c++数组类一起工作