查找boost python对象的类型

Find the type of boost python object

本文关键字:类型 对象 python boost 查找      更新时间:2023-10-16

我一直将python嵌入到c++中,我想知道是否有办法找到boost::python::对象的类型,该对象是执行python模块的函数后的结果。我的代码如下:

boost::python::object module_ = boost::python::import("..libName");
boost::python::object result_ = module_.attr("..functionName")(arg1, arg2,...);
//suppose if the result is int,
int a_ = boost::python::extract<int>(result_);

从上面的代码片段,我想知道的是,如果有办法找到的类型在提取结果之前。在上面的代码中,结果_可以是任何类型,如list, tuple…

你可以试试这个

std::vector<std::string> list_to_vector(boost::python::list& l)
{
    for (int i = 0; i < len(n); ++i)
    {
        boost::python::extract<boost::python::object> objectExtractor(l[i]);
        boost::python::object o=objectExtractor();
        std::string object_classname = boost::python::extract<std::string>(o.attr("__class__").attr("__name__"));
        std::cout<<"this is an Object: "<<object_classname<<std::endl;
    }
    ...................................................
    ...................................................
 }

既然你似乎想检查它是否是一个整数,你可以使用extract<T> x(o):

boost::python::extract<int> n(o);
if ( n.check() )
    // it's an integer, or at least convertible to one
else
    // not an integer

文档说:

提取x (o);构造一个提取器,其check()成员函数可用于询问转换是否可用而不引起要抛出的异常。

这听起来好像可以将浮点数转换为整数,但我试过了,它没有。换句话说,我真的不相信它每次都能做正确的事情!

对于内置类型,在本例中是整数,我认为使用PyInt_Check更安全,但至少当测试这里的一些代码时,它不是立即可用的。

换句话说,如果您需要确定非Python内置对象的类型,我会遵循@Aereaux的建议使用PyObject_IsInstance。(但我个人更希望有一个干净的Boost Python代码库,而不是混合。)

有几种方法可以获得对象的类型。使用哪一种取决于您想要的结果格式。您可以使用result_.attr("__class__")来获得类作为boost::python::对象。您还可以使用PyObject_IsInstance函数来检查它是否是您认为的类型。最后,可以使用PyObject_Type函数以PyObject*的形式获取它的类型。