找到boost python对象的类型

时间:2013-06-10 13:29:57

标签: 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_);

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

3 个答案:

答案 0 :(得分: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;
    }
    ...................................................
    ...................................................
 }

它对我有用。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

由于您似乎想要检查它是否为整数,您可以使用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

documentation说:

  

提取x(o);构造一个提取器,其check()成员函数   可用于询问转换是否可用而不会导致   抛出的例外。

这可能听起来好像浮动可能被视为可转换为整数,但我尝试了它,并且它没有。换句话说,我不相信它每次都做对了!

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

换句话说,如果您需要确定非内置嵌入的对象类型,请遵循使用@Aereaux's suggestionPyObject_IsInstance。 (但我个人更喜欢拥有一个干净的Boost Python代码库,而不是混合代码。)