python - 如何在 cython 代码中使用 Python Decimal 对象?

标签 python cython

我天真地尝试

from decimal cimport Decimal

cpdef Decimal to_decimal(str value):
    return Decimal(value)

但是当我尝试编译这个时,我得到了以下错误

Error compiling Cython file:
------------------------------------------------------------
...
from decimal cimport Decimal
^
------------------------------------------------------------

helloworld.pyx:1:0: 'decimal.pxd' not found

Error compiling Cython file:
------------------------------------------------------------
...
from decimal cimport Decimal
^
------------------------------------------------------------

helloworld.pyx:1:0: 'decimal/Decimal.pxd' not found

Error compiling Cython file:
------------------------------------------------------------
...
from decimal cimport Decimal

cpdef Decimal to_decimal(str value):
     ^
------------------------------------------------------------

helloworld.pyx:3:6: 'Decimal' is not a type identifier

Error compiling Cython file:
------------------------------------------------------------
...
from decimal cimport Decimal

cpdef Decimal to_decimal(str value):
    return Decimal(value)
          ^
------------------------------------------------------------

helloworld.pyx:4:11: 'Decimal' is not a constant, variable or function identifier

我知道 Decimal 类是从这个 c 扩展文件创建的 https://github.com/python/cpython/blob/master/Modules/_decimal/_decimal.c .所以它似乎应该在 cython 代码中可用。谁知道怎么做?

最佳答案

你是说标准库模块 decimal 吗?

如果那样,你不能cimport Decimal 因为它不是cython extension type在 pxd 文件中声明(如 C 头文件)。 此外,出于同样的原因,您不能将函数返回值键入 Decimal。事实上,Decimal 是用 C 实现的,但它不是 cython 扩展类型,或者 cython 目前没有内置支持它作为类型标识符。

你想要做的看起来像:

class Foo:
    pass

cpdef Foo func():   # the same compile error
    pass

但是,以下是有效的:

cdef class Foo:
    pass

cpdef Foo func():
    pass

总之,你可以使用cdef class作为类型标识,而不是纯python类。您可以像这样修改代码:

from decimal import Decimal

cpdef to_decimal(str value):
    return Decimal(value)

您可能想知道为什么会这样:cdef list my_list = [] 因为list 不是cdef 类。好吧,cython 有 built-in 支持它!

您可能还对 cython 提供的标准 header 感兴趣,通常在 site-packages/Cython/Includes 中,确保查看 cpython 子文件夹。

关于python - 如何在 cython 代码中使用 Python Decimal 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60922556/

相关文章:

python - Cython pyd文件不通过python导入

python flask restful接收图像

python - python 中的面向对象设计问题,has-a 与 is-a

python - 如何在字符串中找到匹配的大括号?

python - 旋转后的 OpenGL python 和 pygame 翻译不适用于鼠标外观和移动

python - 使用 numpy 或 cython 进行高效的成对 DTW 计算

python - 只打包用 Cython 编译的 python 库的二进制编译 .so 文件

python - 将行的最后一个元素与 pandas 中的行的其余部分进行比较

python - 导入时python编译文件的优先级是多少?

c - 3D vector ,返回指针还是返回结构?