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

3

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

1个回答

5

Decimal 是使用C实现Python回退 (回退代码)编写的。因此,它并不是真正的单一类型,您不能使用C API函数来检查。应该像在Python中一样使用isinstance

即使您成功使用C实现类型检查,它也只被定义为C APIisinstance等效的宏 - 花费大量时间试图强制其工作确实没有任何优势。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接