Python数字基类或如何确定值是一个数字

时间:2017-06-26 09:14:35

标签: python inheritance types numbers base-class

Python似乎缺少"所有数字",e的基类。 G。 intfloatcomplexlong(在Python2中)。这是不幸的,对我来说有点不方便。

我正在编写一个函数,用于将数据类型相互匹配(树匹配/搜索算法)。为此,我想测试listdict s,str或"数字"的输入值。四个案例中的每一个都是单独处理的,但我不想区分intlongfloatcomplex(尽管后者可能不会出现) 。如果所有数字类型都是从基类型number派生的,那么这很容易实现,但不幸的是,它们不是,AFAICS。

这种显性的强制使得很明显包含了异常的complex。这通常会引发我不想考虑的问题。我的设计相当于所有数字类型"比那个明确的清单。我也不想明确列出来自其他库的所有可能的数字类型,例如numpy或类似的。

第一个问题,而不是理论问题:为什么设计师没有让所有数字类型继承一个公共数字基类?有没有一个很好的理由,也许是关于它的理论让它看起来不推荐?或者为更高版本的Python提出这个想法是否有意义?

第二个问题,更实用的一个:是否有推荐的方法来检查作为数字的值,也许是我不知道的库调用?使用isinstance(x, (int, float, complex, long))的直接版本确实看起来像是一个离合器,不兼容Python3,它不再知道long类型,并且不会包括基于库的数字类型,如numpy.int32

2 个答案:

答案 0 :(得分:5)

实际上是您列出的那些类型的基类。

如果你没有看到numpy类型,一个很好的起点是numbers.Complex

>>> import numbers
>>> isinstance(1+9j, numbers.Complex)
True
>>> isinstance(1L, numbers.Complex)
True
>>> isinstance(1., numbers.Complex)
True
>>> isinstance(1, numbers.Complex)
True

当你开始包含来自numpy的那些时,它会变得有点麻烦,但是,numbers.Complex抽象基类已经处理了大量提到的案例。

答案 1 :(得分:1)

抱歉,聚会有点晚了。但这可能对本页的未来读者有所帮助。我建议您使用 Python 的“鸭子输入”字符及其 EAFP(“比许可更容易请求宽恕”)理念:换句话说,只需尝试将有问题的对象用作数字即可。像这样写:

def isnumber(thing):
    try:
        thing + 0
        return True
    except TypeError:
        return False

它应该适用于任何类型的数字,包括用户定义的类。