对于 int
对象,可以使用从 cpython 导入的函数:
%%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'也可以在 check()
中排除,但这看起来只是一种“解决方法”,并不能保证 check()
现在将仅对 decimal
产生影响)。
那么,在cython中正确检查 decimal
的方法是什么?