gpt4 book ai didi

python - Boost.Python 从类型创建句柄

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:49 26 4
gpt4 key购买 nike

在将 C++ 代码暴露给 python 的某些地方,我需要使用 PyObject* .如果我有一个 boost::python::class_ 的实例对象,我可以调用 ptr()在上面。但是,如果我只有类型怎么办?

基本上,给定类型列表boost::python::bases<A, B, C> ,我想将其转换为 boost::python::tuple我可以传递给类似 PyErr_NewExceptionWithDoc() 的实例.这可能吗?

最佳答案

给定一个 C++ 类型 T,可以创建一个 boost::python::type_id对象,然后查询 Boost.Python 注册表以获取注册信息。如果在注册表中找到一个条目,则可以使用它来获取为 T 类型创建的 Python 类的句柄:

/// @brief Get the class object for a wrapped type that has been exposed
/// through Boost.Python.
template <typename T>
boost::python::object get_instance_class()
{
// Query into the registry for type T.
namespace python = boost::python;
python::type_info type = python::type_id<T>();
const python::converter::registration* registration =
python::converter::registry::query(type);

// If the class is not registered, return None.
if (!registration) return python::object();

python::handle<PyTypeObject> handle(python::borrowed(
registration->get_class_object()));
return python::object(handle);
}

这是一个完整的例子demonstrating在 Boost.Python 注册表中定位 Python 类对象:

#include <boost/python.hpp>
#include <iostream>

/// @brief Get the class object for a wrapped type that has been exposed
/// through Boost.Python.
template <typename T>
boost::python::object get_instance_class()
{
// Query into the registry for type T.
namespace python = boost::python;
python::type_info type = python::type_id<T>();
const python::converter::registration* registration =
python::converter::registry::query(type);

// If the class is not registered, return None.
if (!registration) return python::object();

python::handle<PyTypeObject> handle(python::borrowed(
registration->get_class_object()));
return python::object(handle);
}

struct spam {};

int main()
{
Py_Initialize();

namespace python = boost::python;
try
{
// Create the __main__ module.
python::object main_module = python::import("__main__");
python::object main_namespace = main_module.attr("__dict__");

// Create `Spam` class.
// >>> class Spam: pass
auto spam_class_object = python::class_<spam>("Spam", python::no_init);
// >>> print Spam
main_module.attr("__builtins__").attr("print")(get_instance_class<spam>());
// >>> assert(spam is spam)
assert(spam_class_object.ptr() == get_instance_class<spam>().ptr());
}
catch (python::error_already_set&)
{
PyErr_Print();
return 1;
}
}

输出:

<class 'Spam'>

有关更多类型相关的功能,例如接受类型对象、isissubclass,请参阅 this回答。

关于python - Boost.Python 从类型创建句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38226401/

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