问题 找到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 ......


6216
2018-06-10 13:29


起源



答案:


你可以试试这个

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

这个对我有用。


9
2017-12-28 16:50



为我工作,我在使用typeid时得到'N5boost6python3api5proxyINS1_13item_policiesEEE'... - Kirjain


答案:


你可以试试这个

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

这个对我有用。


9
2017-12-28 16:50



为我工作,我在使用typeid时得到'N5boost6python3api5proxyINS1_13item_policiesEEE'... - Kirjain


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


3
2018-06-15 02:48





因为您似乎想要检查它是否是整数,您可以使用 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代码库,而不是混合代码库。)


2
2018-01-16 14:24



正如你所说,它不可靠。 extract <bool>会很乐意接受整数 - Sergei
是。自从这篇文章以来,我意识到了这一点 extract 将尝试在兼容类型之间自动转换。确保它完全是一个整数的方法是使用 PyInt_Check。 - csl