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

起飞前

对于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' 也可能被排除在外,check()但这看起来只是 'workaround' - 不能保证check()now只会在 上触发decimal)。

那么decimal在 cython 中检查的正确方法是什么

大卫

Decimal是用C 实现Python 回退回退代码编写的因此,这并不是您可以使用 C API 函数进行检查的单一类型。isinstance像在 Python 中一样使用

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章