0

我有兴趣在decimal.DecimalC 的扩展中创建对象。我在文档中找不到任何关于此的文档

是否存在这方面的文档?有没有任何地方的例子?

我在 Python git存储库中找到了实现该对象的源代码,所以我确信我可以进行一些试验和错误,并通过制定头文件导入来应付,但首选文档(如果它存在)。

4

2 回答 2

2

在 Python 3.10 中,将为此提供一个C API。您需要提供自己的 libmpdec 和mpdecimal.h标头,并使用import_decimal(). (请注意,C 级import_decimal()调用与 Python 级语句完全不同且无关import decimal。)

设置后,您可以分配一个未初始化的 Decimal 对象

PyObject *dec = PyDec_Alloc();

然后得到一个指向内部的mpd_t指针

mpd_t *dec_internal = PyDec_Get(dec);

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

要使用mpd_t现有的 Decimal 对象,您可以执行

const mpd_t *dec_internal = PyDec_GetConst(some_existing_decimal);

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


至于 3.10 之前的代码,没有 Decimal C API。您只需要执行与import decimal; d = Decimal(whatever)使用PyImport_ImportModulePyObject_GetAttrStringPyObject_Call.

于 2021-03-04T14:43:11.813 回答
1

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

以下代码段适用于所有三种情况(十进制/_decimal/_pydecimal)的 Python 3.9。

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));

输出:

dec: 123.45

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

于 2021-03-04T14:33:23.413 回答