gpt4 book ai didi

c++ - 如何在我的 C++ __getitem__ 函数中处理切片(供 SWIG 使用)

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:38 39 4
gpt4 key购买 nike

我正在为扩展 std::vector 实例化的 C++ 类开发 Python 绑定(bind)。为了让 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 *) 转换为包装器类。此外,在创建切片时,我需要“手动”将 Column* 转换为 PyObject*,然后再将其插入 PyList。

我该怎么做?

最佳答案

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

如果添加到模块接口(interface)的开头:

%include "pyabc.i"
%include "std_vector.i" // Assuming you don't already

在某个地方,如果你还没有这样做的话:

%template(MetaDataBase) std::vector<Column*>;

然后这将导致包装的std::vector 满足Python 的MutableSequence 的要求。 . (我认为这应该足以实现您在 Python 端寻找的内容,您可能还需要使用 -extranative 调用 SWIG)。

可能还值得注意 - 对于您当前的 __getitem__,您可以使用类似以下内容在 SWIG 接口(interface)文件中声明和定义它:

%extend MetaData {
Column* __getitem__(int i) { return (*self)[i]; }
};

这允许您在不使用 SWIG+Python 特定代码“污染”您的“正常”头文件的情况下执行此操作。

关于c++ - 如何在我的 C++ __getitem__ 函数中处理切片(供 SWIG 使用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8218314/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com