【问题标题】:How do you convert a Python Decimal instance to a C++ double?如何将 Python Decimal 实例转换为 C++ double?
【发布时间】:2021-02-19 14:39:48
【问题描述】:

在 Python 本身中,您只需编写 float(f),其中 f 是 Python 十进制。这会产生一个 double 类型(在 Python 中称为 float)。

但我需要在boost::python 中执行此操作。我的代码(删节)是

double toDouble(boost::python::object obj)
{
    std::string type = boost::python::extract<std::string>(obj.attr("__class__").attr("__name__"));
    std::string module = boost::python::extract<std::string>(obj.attr("__class__").attr("__module__"));
    std::string cls = module + "." + type;

    if (cls == "decimal.Decimal"){
        double f = boost::python::extract<double>(obj);
        return f;
    }
    
    throw "Oops";
}

但我得到一个错误

没有注册的转换器能够产生类型的 C++ 右值 来自这个十进制类型的 Python 对象的 double.Decimal

我该怎么做?我无法想象它很复杂。显然我错过了一些东西。

【问题讨论】:

    标签: c++ boost-python


    【解决方案1】:

    if 块中需要的代码是

    static boost::python::object builtins
        = boost::python::import("builtins");
    static boost::python::object function 
        = boost::python::extract<boost::python::object>(builtins.attr("float"));
    boost::python::object ret = function(obj);
    double f = boost::python::extract<double>(ret);
    

    我确实在使用 Python 函数 float(obj)

    从表面上看,您已经熟悉boost::python::extract

    float 是一个内置 python 函数。见https://docs.python.org/3/library/functions.html。所以第一条语句是导入包含内置函数的模块。第二条语句获取float函数。

    第三个调用它,在 Boost 文档“调用 Python 函数和方法”的行中。

    您也许可以将它们组合在一起以注册此提取,如果知道 Boost 的精美设计方式,这可能只不过是专门设计一个模板。

    【讨论】:

      猜你喜欢
      • 2010-09-05
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 2021-12-10
      • 2013-03-07
      • 2021-11-08
      • 2010-11-09
      相关资源
      最近更新 更多