gpt4 book ai didi

python - 如何从 C++ 返回 Python 类型的实例

转载 作者:行者123 更新时间:2023-11-28 02:46:50 25 4
gpt4 key购买 nike

如何使用功能等同于 Python 函数的 Boost Python 函数在 C++ 中定义

def test():
return list

最佳答案

虽然 Boost.Python TypeWrappers Boost.Python 提供了一种方便的方法来为某些内置的 Python 类型实例化对象,而 Boost.Python 本身并不提供对一流对象的直接支持。但是,可以通过 Boost.Python 通过 Python/C API 中适当的 PyTypeObject 对象返回一级对象。

在这种特殊情况下,Python list类型是 PyList_Type在 Python/C API 中。 Python 代码:

def test():
return list

等同于以下 C++ Boost.Python 代码:

boost::python::object test()
{
namespace python = boost::python;
python::handle<PyTypeObject> handle(python::borrowed(&PyList_Type));
return python::object(handle);
}

混合使用 Python/C API 和更高级别的 Boost.Python 代码时,必须使用 boost::python::handle构建一个boost::python::object来自 PyObject 对象或具有派生(布局兼容)类型的对象,例如 PyTypeObjecthandle 本质上是一个智能指针,负责处理 Python 引用计数。 handle 的析构函数将始终递减关联的 Python 对象的引用计数。因此,在构造handle 时必须小心,因为必须知道handle 是否需要增加引用计数,或者它是否已经增加。如果引用计数尚未递增,例如在上面的代码中,则必须将 boost::python::borrowed() 的返回类型传递给 handle的构造函数。有关更多详细信息,请考虑阅读此 link .


这是一个完整的例子:

#include <boost/python.hpp>

boost::python::object test()
{
namespace python = boost::python;
python::handle<PyTypeObject> handle(python::borrowed(&PyList_Type));
return python::object(handle);
}

BOOST_PYTHON_MODULE(example)
{
namespace python = boost::python;
python::def("test", &test);
}

交互使用:

>>> import example
>>> assert(example.test() is list)
>>> t = example.test()
>>> assert(t((1, 2, 3)) == [1, 2, 3])
>>> assert(t((1, 2, 3)) != (1, 2, 3))
>>> del t
>>> from sys import getrefcount # test for proper reference counting
>>> n = getrefcount(list)
>>> t = example.test()
>>> assert(n + 1 == getrefcount(list))
>>> del t
>>> assert(n == getrefcount(list))

关于python - 如何从 C++ 返回 Python 类型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24125683/

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