14

我一直在将 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_);

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

4

3 回答 3

12

你可以试试这个

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;
    }
    ...................................................
    ...................................................
 }

这个对我有用。

于 2013-12-28T16:50:11.343 回答
4

由于您似乎想检查它是否是整数,您可以使用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() 成员函数可用于询问转换是否可用,而不会引发异常。

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

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

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

于 2015-01-16T14:24:28.457 回答
4

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

于 2013-06-15T02:48:12.570 回答