发布于 2021-03-04 14:43:11
在Python3.10中,这里将有一个C API。您需要提供自己的libmpdec和mpdecimal.h头,并使用import_decimal()初始化十进制API。(请注意,C级import_decimal()调用与Python语句import decimal完全不同,而且与之无关。)
安装完成后,您可以使用
PyObject *dec = PyDec_Alloc();,然后获得指向内部mpd_t的指针
mpd_t *dec_internal = PyDec_Get(dec);并使用libmpdec函数初始化mpd_t。(请注意,十进制对象在逻辑上是不可变的,因此您应该避免变异任何十进制对象,而不是您刚才用PyDec_Alloc分配的对象。)
要使用现有十进制对象的mpd_t,可以这样做
const mpd_t *dec_internal = PyDec_GetConst(some_existing_decimal);然后使用非可变的libmpdec函数。
至于之前的3.10代码,没有十进制C API.您只需使用像import decimal; d = Decimal(whatever)、PyObject_GetAttrString和PyObject_Call这样的函数来执行C级等效的PyObject_Call。
发布于 2021-03-04 14:33:23
您的问题是关于decimal.Decimal类的,而链接代码指向使用库libmpdec的优化模块_decimal。
下面的片段将适用于Python3.9,适用于所有三种情况(十进制/_十进制/_py十进制)。
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有关Python3.3中的_decimal实现的一些背景信息可以在https://bugs.python.org/issue7652上找到
https://stackoverflow.com/questions/66325531
复制相似问题