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

Bef*_*ght 3 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))
Run Code Online (Sandbox Code Playgroud)
False
Run Code Online (Sandbox Code Playgroud)

但似乎没有对应的功能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))
Run Code Online (Sandbox Code Playgroud)
True
False
Run Code Online (Sandbox Code Playgroud)

但这不仅会捕获decimal所有可能转换为的内容float。例如,也check("1.1")返回True(可能也排除了'str',check()但这看起来仅是'替代方法'-无法保证check()现在在上触发decimal)。

那么检查decimalcython 的正确方法是什么?

Dav*_*idW 5

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

即使您确实设法使用了C实现类型检查,它也始终被定义为isinstance等效于C API的宏-花费大量时间试图使其强制工作确实没有任何优势。