检查对象是否为十进制的正确方法

时间:2019-07-16 10:17:24

标签: python types cython

对于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的正确方法是什么?

1 个答案:

答案 0 :(得分:5)

DecimalC implementationPython fallbackcode for fallback)编写。因此,并不是可以使用C API函数进行检查的单一类型。像在Python中一样使用isinstance

即使您确实设法使用过C implementation type-check,它也仍然被定义为围绕C API isinstance等效的宏-花费大量时间试图使其强制工作确实没有任何优势。 。