[英]How can I use the Python Decimal object in cython code?
我天真地嘗試
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
因為它不是在 pxd 文件中聲明的cython 擴展類型(如 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 class
。 好吧,cython built-in
了對它的支持!
您可能還對 cython 提供的標准頭文件感興趣,通常在site-packages/Cython/Includes
,請確保查看cpython
子文件夾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.