找到boost python对象的类型

Uth*_*mar 12 c++ python boost-python

我一直在将python嵌入到c ++中,我想知道是否有办法找到boost :: python :: object的类型,这是执行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_);
Run Code Online (Sandbox Code Playgroud)

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

小智 10

你可以试试这个

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;
    }
    ...................................................
    ...................................................
 }
Run Code Online (Sandbox Code Playgroud)

这个对我有用.


csl*_*csl 5

由于您似乎想检查它是否是整数,因此可以使用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
Run Code Online (Sandbox Code Playgroud)

文档

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

这听起来好像 float 可以被视为可转换为 integer,但我尝试了,但事实并非如此。换句话说,我并不真的相信它每次都会做正确的事情!

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

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


Aer*_*aux 4

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