我天真地尝试
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/