如何在boost::Python中处理Python切片对象? 假设C++中有一个类 MyReals。它实现了一个SomeType数组,为了在Python中为它生成一个\uu getitem\uuuu函数,我做了如下操作 const SomeType& getitem(const MyArray *arr, PyObject *slice) { // ??? } BOOST_PYTHON_MODULE(mymodule) { class_<MyArray>("MyArray") .def("__getitem__", &getitem) // probably some other methods... ; } constsometype&getitem(constmyarray*arr,PyObject*slice){ // ??? } BOOST_PYTHON_模块(mymodule) { 类(“MyArray”) .def(“\uuuGetItem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu //可能还有其他方法。。。 ; }

如何在boost::Python中处理Python切片对象? 假设C++中有一个类 MyReals。它实现了一个SomeType数组,为了在Python中为它生成一个\uu getitem\uuuu函数,我做了如下操作 const SomeType& getitem(const MyArray *arr, PyObject *slice) { // ??? } BOOST_PYTHON_MODULE(mymodule) { class_<MyArray>("MyArray") .def("__getitem__", &getitem) // probably some other methods... ; } constsometype&getitem(constmyarray*arr,PyObject*slice){ // ??? } BOOST_PYTHON_模块(mymodule) { 类(“MyArray”) .def(“\uuuGetItem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu //可能还有其他方法。。。 ; },python,c++,python-3.x,slice,boost-python,Python,C++,Python 3.x,Slice,Boost Python,通过使用,可以在切片中获取索引。然而,“” 有没有更好的“boost方式”可以做到这一点?boost.Python旨在最大限度地减少与PyObject交互的需要,它通常通过以下方式实现: 提供更高级别的类型包装 允许通过相关的boost::Python::object访问Python对象的接口 例如,可以用与Python中类似的方式通过C++访问Python对象的接口。下面演示如何访问引用pythonslice实例的boost::python::object的start属性: namespa

通过使用,可以在
切片
中获取索引。然而,“”


有没有更好的“boost方式”可以做到这一点?

boost.Python旨在最大限度地减少与
PyObject
交互的需要,它通常通过以下方式实现:

  • 提供更高级别的类型包装
  • 允许通过相关的
    boost::Python::object
    访问Python对象的接口

例如,可以用与Python中类似的方式通过C++访问Python对象的接口。下面演示如何访问引用python

slice
实例的
boost::python::object
start
属性:

namespace python=boost::python;
python::object slice=get_slice_object();
python::objectstart=slice.attr(“start”);
std::size\u t start\u index=!开始。是_none()
? python::extract(start)//提取索引。
: 0;                                  // 违约
虽然这种方法可行,但它往往会产生大量样板代码:在提供
None
时创建默认值,处理零长度切片,并将负索引转换为正索引。在本例中,Boost.Python提供了一个更高级的类型包装器,它有一个
get\u index()
成员函数,该函数将删除大部分样板代码。下面是一个完整的最小示例:

#包括
#包括
#包括
#包括
#包括
///@创建0到N范围的简短实体模型类。
结构计数器
{
计数器(标准:尺寸)
{
数据保留(n);
boost::copy(boost::irange(std::size_t(0),n),std::back_inserter(数据));
}
std::矢量数据;
};
///@计数器对象的简短句柄切片。
boost::python::list spam\u getitem(
const counter&self,
boost::python::slice)
{
名称空间python=boost::python;
python::列表结果;
//如果范围为,则Boost.Python将抛出std::invalid_参数
//空的。
python::slice::range;
尝试
{
range=slice.get_索引(self.data.begin(),self.data.end());
}
catch(std::无效的_参数)
{
返回结果;
}
//在完全闭合范围内迭代。
对于(;range.start!=range.stop;std::advance(range.start,range.step))
{
结果.追加(*范围.开始);
}
result.append(*range.start);//处理最后一项。
返回结果;
}
BOOST_PYTHON_模块(示例)
{
名称空间python=boost::python;
python::class_389;(“计数器”,python::init())
.def(“\uuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
;
}
互动使用:

>>来自示例导入计数器
>>>计数器=计数器(5)
>>>断言(计数器[:]==[0,1,2,3,4])
>>>断言(计数器[:-2]=[0,1,2])
>>>断言(计数器[-2::][3,4])
>>>断言(计数器[::2]=[0,2,4])
>>>断言(计数器[1::2]=[1,3])
>>>断言(计数器[100:][=])

Boost.Python旨在最大限度地减少与
PyObject
交互的需要,它通常通过以下方式实现这一点:

  • 提供更高级别的类型包装
  • 允许通过相关的
    boost::Python::object
    访问Python对象的接口

例如,可以用与Python中类似的方式通过C++访问Python对象的接口。下面演示如何访问引用python

slice
实例的
boost::python::object
start
属性:

namespace python=boost::python;
python::object slice=get_slice_object();
python::objectstart=slice.attr(“start”);
std::size\u t start\u index=!开始。是_none()
? python::extract(start)//提取索引。
: 0;                                  // 违约
虽然这种方法可行,但它往往会产生大量样板代码:在提供
None
时创建默认值,处理零长度切片,并将负索引转换为正索引。在本例中,Boost.Python提供了一个更高级的类型包装器,它有一个
get\u index()
成员函数,该函数将删除大部分样板代码。下面是一个完整的最小示例:

#包括
#包括
#包括
#包括
#包括
///@创建0到N范围的简短实体模型类。
结构计数器
{
计数器(标准:尺寸)
{
数据保留(n);
boost::copy(boost::irange(std::size_t(0),n),std::back_inserter(数据));
}
std::矢量数据;
};
///@计数器对象的简短句柄切片。
boost::python::list spam\u getitem(
const counter&self,
boost::python::slice)
{
名称空间python=boost::python;
python::列表结果;
//如果范围为,则Boost.Python将抛出std::invalid_参数
//空的。
python::slice::range;
尝试
{
range=slice.get_索引(self.data.begin(),self.data.end());
}
catch(std::无效的_参数)
{
返回结果;
}
//在完全闭合范围内迭代。
对于(;range.start!=range.stop;std::advance(range.start,range.step))
{
结果.追加(*范围.开始);
}
result.append(*range.start);//处理最后一项。
返回结果;
}
BOOST_PYTHON_模块(示例)
{
名称空间python=boost::python;
python::class_389;(“计数器”,python::init())
.def(“\uuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
;
}
互动使用:

>>来自示例导入计数器
>>>计数器=计数器(5)
>>>断言(计数器[:]==[0,1,2,3,4])
>>>断言(计数器[:-2]=[0,1,2])
>>>断言(计数器[-2::][3,4])
>>>断言(计数器[::2]=[0,2,4])
>>>断言(公司)