【问题标题】:Correct way to check if object is decimal检查对象是否为十进制的正确方法
【发布时间】:2019-11-25 01:24:06
【问题描述】:

对于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() 中,但这看起来只是'解决方法' - 不能保证check() 现在会触发 decimal)。

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

【问题讨论】:

    标签: python types cython


    【解决方案1】:

    DecimalC implementationPython fallback (code for fallback) 编写。因此 is 并不是您可以使用 C API 函数来检查的单一类型。像在 Python 中一样使用isinstance

    即使您确实设法使用了 C implementation type-check,它也只是定义为 C API isinstance 等价的宏 - 花大量时间试图强制它工作确实没有任何优势。

    【讨论】:

      猜你喜欢
      • 2013-01-13
      • 2018-08-16
      • 2023-03-14
      • 1970-01-01
      • 2014-10-22
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多