如何将 Python Decimal 实例转换为 C++ double?
How do you convert a Python Decimal instance to a 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";
}
但是我得到一个错误
No registered converter was able to produce a C++ rvalue of type
double from this Python object of type decimal.Decimal
我该怎么做?我无法想象它有多复杂。显然我错过了一些东西。
您在 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 设计的优美方式,相当于专门化一个模板。
在 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";
}
但是我得到一个错误
No registered converter was able to produce a C++ rvalue of type double from this Python object of type decimal.Decimal
我该怎么做?我无法想象它有多复杂。显然我错过了一些东西。
您在 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 设计的优美方式,相当于专门化一个模板。