如何将Python Decimal实例转换为c++ double类型?



在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";
}

但是我得到一个错误

没有注册的转换器能够产生类型为从这个十进制类型的Python对象中获取double。十进制

我该怎么做?我无法想象这有多复杂。很明显我漏掉了什么。

您需要在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设计的美丽方式,相当于一个模板的专业化。

最新更新