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)
这个对我有用.
由于您似乎想检查它是否是整数,因此可以使用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 代码库,而不是混合代码。)
有几种方法可以获取对象的类型。您使用哪一种取决于您想要结果的格式。您可以使用result_.attr("__class__")该类作为 boost::python::object 来获取。您还可以使用PyObject_IsInstance 函数来检查它是否是您认为的类型。最后,您可以使用PyObject_Type 函数来获取 PyObject* 的类型。