我一直在将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 ......
答案 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
提取x(o);构造一个提取器,其check()成员函数 可用于询问转换是否可用而不会导致 抛出的例外。
这可能听起来好像浮动可能被视为可转换为整数,但我尝试了它,并且它没有。换句话说,我不相信它每次都做对了!
对于内置类型,在这种情况下是一个整数,我认为使用PyInt_Check
更安全,但至少当我在这里测试了一些代码时,它没有立即可用。
换句话说,如果您需要确定非内置嵌入的对象类型,请遵循使用@Aereaux's suggestion的PyObject_IsInstance
。 (但我个人更喜欢拥有一个干净的Boost Python代码库,而不是混合代码。)