【问题标题】:Find the type of boost python object查找 boost python 对象的类型
【发布时间】:2013-06-10 13:29:56
【问题描述】:

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

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

【问题讨论】:

    标签: c++ python boost-python


    【解决方案1】:

    你可以试试这个

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

    它对我有用。

    【讨论】:

    • 为我工作,我在使用 typeid 时得到 'N5boost6python3api5proxyINS1_13item_policiesEEE'...
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      由于您似乎想检查它是否为整数,您可以使用extract&lt;T&gt; 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 更安全,但至少当 在这里测试一些代码时,它不是立即可用的。

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

      【讨论】:

      • 正如你所说,它不可靠。 extract 很乐意接受整数
      • 是的。从这篇文章开始,我意识到extract 将尝试在兼容类型之间自动转换。确保它完全是整数的方法是使用PyInt_Check
      猜你喜欢
      • 1970-01-01
      • 2022-01-25
      • 2010-09-25
      • 1970-01-01
      • 2018-09-05
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多