簡體   English   中英

如何在 cython 代碼中使用 Python Decimal 對象?

[英]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子文件夾。

gmpy2導出可在 Cython 代碼中使用的本機 API

提供的 最小示例是用 C 風格的 cython 代碼編寫的,因此您的代碼的可讀性將降低。 或者,您可以在 Cython 中編寫自己的慣用 OOP 包裝器。

如果這樣的包裝器已經存在,請糾正我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM