如何将 Python Decimal 实例转换为 C++ double?
Posted
技术标签:
【中文标题】如何将 Python Decimal 实例转换为 C++ double?【英文标题】:How do you convert a Python Decimal instance to a 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
我该怎么做?我无法想象它很复杂。显然我错过了一些东西。
【问题讨论】:
【参考方案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 的精美设计方式,这可能只不过是专门设计一个模板。
【讨论】:
以上是关于如何将 Python Decimal 实例转换为 C++ double?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 C# BigInteger 转换为 MySQL DECIMAL(36,18)?
可以在 Python 中简单地将 Decimal('5E+1') 转换为 Decimal('50') 吗?
如何将具有 Decimal 的 spark DataFrame 转换为具有相同精度的 BigDecimal 的 Dataset?