对于int
对象,可以这样使用cpython的cimported函数:
%%cython
from decimal import Decimal
from cpython cimport PyLong_Check
val_decimal = Decimal(1)
print(PyLong_Check(val_decimal))
False
但是似乎decimal
没有相应的功能。
另一种方法是像这样使用try-except
:
%%cython
from decimal import Decimal
from cpython cimport PyFloat_Check
cdef bint check(object val):
if PyFloat_Check(val):
return False
try:
float(val)
return True
except:
return False
val_decimal = Decimal(1.1)
val_float = 1.1
print (check(val_decimal))
print (check(val_float))
True
False
但这不仅会捕获decimal
,还会捕获所有可能转换为float
的东西。例如。 check("1.1")
也会返回True
({str中也可能排除了'str',但这看起来只是'替代方法')-无法保证check()
现在会触发< check()
上的em> only 。
那么在cython中检查decimal
的正确方法是什么?
答案 0 :(得分:5)
Decimal
用C implementation和Python fallback(code for fallback)编写。因此,并不是可以使用C API函数进行检查的单一类型。像在Python中一样使用isinstance
。
即使您确实设法使用过C implementation type-check,它也仍然被定义为围绕C API isinstance
等效的宏-花费大量时间试图使其强制工作确实没有任何优势。 。