首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用C构造decimal.Decimal对象?

如何使用C构造decimal.Decimal对象?
EN

Stack Overflow用户
提问于 2021-02-23 00:50:52
回答 2查看 214关注 0票数 1

我对在C扩展中创建decimal.Decimal对象感兴趣。我在文档中找不到任何有关这方面的文档。

有这方面的文档吗?有什么例子吗?

我已经在Python 存储库中找到了实现该对象的源代码,所以我确信我可以做一些尝试和错误,并在处理头文件导入时步履维艰,但是文档是首选的(如果存在的话)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-04 14:43:11

在Python3.10中,这里将有一个C API。您需要提供自己的libmpdec和mpdecimal.h头,并使用import_decimal()初始化十进制API。(请注意,C级import_decimal()调用与Python语句import decimal完全不同,而且与之无关。)

安装完成后,您可以使用

代码语言:javascript
复制
PyObject *dec = PyDec_Alloc();

,然后获得指向内部mpd_t的指针

代码语言:javascript
复制
mpd_t *dec_internal = PyDec_Get(dec);

并使用libmpdec函数初始化mpd_t。(请注意,十进制对象在逻辑上是不可变的,因此您应该避免变异任何十进制对象,而不是您刚才用PyDec_Alloc分配的对象。)

要使用现有十进制对象的mpd_t,可以这样做

代码语言:javascript
复制
const mpd_t *dec_internal = PyDec_GetConst(some_existing_decimal);

然后使用非可变的libmpdec函数。

至于之前的3.10代码,没有十进制C API.您只需使用像import decimal; d = Decimal(whatever)PyObject_GetAttrStringPyObject_Call这样的函数来执行C级等效的PyObject_Call

票数 3
EN

Stack Overflow用户

发布于 2021-03-04 14:33:23

您的问题是关于decimal.Decimal类的,而链接代码指向使用库libmpdec的优化模块_decimal

下面的片段将适用于Python3.9,适用于所有三种情况(十进制/_十进制/_py十进制)。

代码语言:javascript
复制
PyObject *module = PyImport_ImportModule((char *) "decimal");
PyObject *clazz = PyObject_GetAttrString(module, (char *) "Decimal");
PyObject *value = PyUnicode_FromString("123.45");
PyObject *object = PyObject_CallOneArg(clazz, value);
PyObject  *str = PyObject_Str(object);
// C++
std::cout << "dec: " << PyUnicode_AsUTF8(str) << std::endl;
// C
// printf("dec: %s\n", PyUnicode_AsUTF8(str));

产出:

代码语言:javascript
复制
dec: 123.45

有关Python3.3中的_decimal实现的一些背景信息可以在https://bugs.python.org/issue7652上找到

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66325531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档